Archivio mensile:Febbraio 2012

Estendere il WebClient per gestire un CookieStore

In C# , le system.net mettono a disposizione un oggetto chiamato WebClient per fare delle chiamate http in post a risorse identificate da un URI.

Nel mio caso l’ho utilizzato per fare delle chiamate dal CodeBehind di un applicazione web, per interrogare dei servizi web esposti in maniera restfull che accettavano dati in POST.

Dovendo gestire la sessione con questi servizi di backend e a volte avendo la necessità di dovergli pasare dei Cookie di autenticazione o altri cookie , mi sono trovato a doverlo estendere (per non lavorare direttamente con il WebRequest, oggetto su cui poggia il WebClient).

Il webclient offre pochissime funzionalità, ma estenderlo è molto facile.

In questo esempio aggiungiamo la possibilità di creare un proprio CookieStore, prima di una chiamata, in modo da potergli passare tutti i cookie (presi ad esempio dalla Request arrivata alla nostra pagina aspx) necessari al servizio che risponde all’URI interrogata.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using System;

using System.Net;

using System.Web;

public class ExtendedWebClient : WebClient

{

    private CookieContainer m_container = new CookieContainer();

    protected override WebRequest GetWebRequest(Uri address)

    {

        WebRequest request = base.GetWebRequest(address);
        HttpWebRequest webRequest = request as HttpWebRequest;
        if (webRequest!=null){
            webRequest.CookieContainer = m_container;
        }
        return request;
    }

    public void SetCookies(HttpCookieCollection collection,string domain){
        m_container = new CookieStore();
        for (int j=0;j<collection.Count;j++){
            HttpCookie httpCookie = collection.Get(j);
            Cookie cookie = new Cookie();
            cookie.Domain = domain;
            cookie.Expires = httpCookie.Expires;  
            cookie.Name = httpCookie.Name;
            cookie.Path = httpCookie.Path;
            cookie.Secure = httpCookie.Secure;
            cookie.Value = httpCookie.Value;
            m_container.Add(cookie);
        }
    }
}

Oltre a gestire il cookieStore, dobbiamo preoccuparci della conversione dei cookies da HttpCookie (arrivati dalla Request) a quelli più dettagliati della System.Net.

Per utilizzare il nostro nuovo webclient e passargli i cookie possiamo fare in questo modo:

1
2
3
4
5
    ExtendendWebClient client = new ExtendedWebClient();
    client.SetCookies(request.Cookies,request.Url.Host);
    byte[] data = client.DownloadData("http://www.google.it");
    System.Text.Encoding enc = System.Text.Encoding.UTF8;
    string output = enc.GetString(data);

In questo modo tutti i cookie vengono impostati nel webclient prima di eseguire la webRequest.

Giocando con il parametro Domain, possiamo andare a filtrare i cookie che ci interessano per la chiamata in questione.

G.r.a. Capitolo 5: I Gemelli Derrick-Bartolini

Oggi voglio descrivervi due personaggi che mi hanno folgorato qualche giorno fa..

Ve li ricordate i gemelli Derrick,James e Jason? quelli di Holly e Benji? quelli che quando dovevano tirare in porta, eseguivano la catapulta infernale, arrivando a sfidare e superare ogni legge della fisica? Quelli che Don Chuck castoro in confronto era senza denti.. Quelli che ad ogni puntata gli crescevano misteriosamente gli incisivi ?

Questi due personaggi esistono e giorni fa, nel gelo artico che avvolgeva il Grande Parcheggio Anulare, li ho visti mimetizzati da trasportatori in un furgone rosso di Bartolini (il corriere espresso)..

Me ne stavo li al freddo e al gelo nella mia Clio Second Hand del 1999 modello Noluxe Spagnolo, quindi senza ausilio di spiegazioni in italiano, sprovvista di aria condizionata funzionante, e con 2 alzacristalli elettrici di cui uno diselettrizzato causa fuga criceto nel motorino, con aria calda fuori uso su cauzione,e accessoriata di grande crepa sul cristallo anteriore, quando li vedo vicino a me..

Dallo stereo senza frontalino (causa furto fuori casa) le note del dolce rumore del Motore Renault 1200, mi facevano da sottofondo melodico e armonioso, una dolce Sonata in 4 quarti, uno per ogni tempo del motore..

Loro erano li, Giacomo e Giasone Derrick-Bartolini, due amici divenuti gemelli per osmosi..

Entrambi ricci e mori, fisico atletico,trasudavano partita di calcetto del giovedi pomeriggio da ogni poro.. La loro giornata lavorativa serve ad occupare il tempo che li separa da una partita a calcetto e la successiva..

Io sono li atterrito dalla visione surreale, immaginandoli mentre pianificano accuratamente la catapulta infernale di stasera ai danni della squadra avversaria, la temuta TNTSWAPTEAM, la squadra di calcetto più temuta della zona, formata solo da veterani del trasporto su ruote, esperti dello stoccaggio in furgone e del “lascio il biglietto tanto sicuramente non c’e’ nessuno in casa”..

Giacomo, quello con i capelli piu corti, era alla guida del mezzo espresso, mentre l’altro mangiava allegramente un metro quadro di pizza raccontando con fare concitato la partita di CEMPIONS LIG del mercoledi.. Le grida di Giasone arrivavano fino alla mia macchina quanto era fitto il suo lancio di sproloqui verso ogni forma di squadra straniera dal nome inpronunciabile.. Tipo il PARIS SANGIERMENNE, IL BORUSSIA DORTMUNDE, IL MANCESTERE IUNITE, LA CHITTESSENKAPPAA MOSCA,LA PATATINAIKOS,LA MECCAFI HAIBOS (sembra un antivirus), LA STRUNZ GRAZ, la squadra poi del giornalista di rai tre, la BORAC BANJANBAUNA, o la sempre verde STENDAR LIEGI BASTON LIEGI..

Tra i fumi dei gas di scarico e complice l’amniotico traffico costante, questi due personaggi, in partenza due individui separati, si sono incontrati e  divenuti amici tramite un processo di meiosi inversa.. Un rapporto osmotico che li rende praticamente cloni.

Che l’artefice di questa fusione sia forse l’effetto Calcio? Che sia modificato geneticamente e la sua assunzione quotidiana può arrivare a creare questa mutazione genetica che ti trasforma in un incrocio tra Pruzzo e Bergomi?

Con questi dubbi amletici, e le grida fatidiche di Giacomo con il sempre verde “machecazzostaiadechelosietepagato20milionideurostocazzodegiocatorechenunsegna”, il traffico si sblocca, qualcosa si muove, lascio la frizione e riparto, versi nuovi mondi.. dove nessuna clio è mai stata prima di oggi..ad un metro davanti a me..

 

 

 

 

 

 

Problemi di deserializzazione array in c#

Un caso semplicissimo,può diventare un incubo per diverse ore…

Un xml di questo tipo:

1
2
3
4
5
6
7
8
9
10
11
<?xml version="1.0" encoding="utf-8"?>
<Applicazioni>
<Applicazione>
<NomeApplicazione>XXX1</NomeApplicazione>
<Stato>Attiva</Stato>
</Applicazione>
<Applicazione>
<NomeApplicazione>XXX2</NomeApplicazione>
<Stato>Attiva</Stato>
</Applicazione>
</Applicazioni>

L’utilizzo di una classe per deserializzare il contenuto di questo xml in un oggetto, in c# , diventa difficile a causa della natura del Root Item di questo xml, “Applicazioni”, che risulta essere un Array di “Applicazione” .

Per poter lavorare in maniera corretta con gli attributi XmlArray e XmlArrayItem, senza stare a romperci la testa, aggiungiamo un nodo contenitore ad “Applicazioni”, come nell’esempio seguente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>

<ServizioStato>
<Applicazioni>
<Applicazione>
<NomeApplicazione>XXX1</NomeApplicazione>
<Stato>Attiva</Stato>
</Applicazione>
<Applicazione>
<NomeApplicazione>XXX2</NomeApplicazione>
<Stato>Attiva</Stato>
</Applicazione>
</Applicazioni>

</ServizioStato>

In questo modo possiamo andare a definire un oggetto per la deserializzazione cosi definito :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
using System;
using System.Xml.Serialization;

namespace ServizioStato
{

[Serializable()]
[XmlRoot("ServizioStato",Namespace="",IsNullable=false)]
public class ServizioStatoApplicazioni
{
private Applicazione[] applicazioni;

[XmlArray("Applicazioni")]
[XmlArrayItem("Applicazione", typeof(Applicazione))]
public Applicazione[] StatoApplicazioni
{
get { return this.applicazioni; }
set { this.applicazioni = value; }
}

}

[Serializable]
public class Applicazione
{
private string nomeApplicazioneField;
private string statoField;

[System.Xml.Serialization.XmlElementAttribute("Applicazione", Namespace="",Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string Applicazione
{
get { return this.nomeApplicazioneField; }
set { this.nomeApplicazioneField = value; }
}
[System.Xml.Serialization.XmlElementAttribute("Stato", Namespace="",Form = System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string Stato
{
get { return this.statoField; }
set { this.statoField = value; }
}
}

Una cosa su cui riflettere è che il tool XSD per la generazione degli oggetti, non ci viene in aiuto con delle strutture definite come il primo esempio (prima dell’aggiunta del nodo ServizioStato), non riuscendo a generare le classi in maniera corretta.