Alkampfer's Place

Il blog di Gian Maria Ricci
posts - 659, comments - 871, trackbacks - 80

My Links

News

Gian Maria Ricci Mvp Logo CCSVI in Multiple Sclerosis

English Blog

Tag Cloud

Article Categories

Archives

Post Categories

Image Galleries

I miei siti

Siti utili

Attenti agli encoding

Talvolta è necessario scaricare pagine internet, per questo scopo il .NET mette a disposizione varie classi, una delle quali è il WebClient, ecco un esempio

Dim wc As New System.Net.WebClient()
   wc.Headers.Add(
"Accept""image/gif, image…)")
   wc.Headers.Add(
"Accept-Language""en,it;q=0.5")
   wc.Headers.Add(
"UA-CPU""x86")
   wc.Headers.Add(
"Accept-Encoding""deflate, gzip")
   wc.Headers.Add(
"User-Agent""Mozilla/4.0 (compatible; MSIE 6.0; …)")

 

ponete attenzione alla quarta riga, dove si mette l'Accept-Encoding, perchè quell'header dice al sito la lista di codifiche di trasmissione che voi capite, mettere "deflate" o "gzip" come nell'esempio è buona cosa, perché limitate il traffico del sito, ma attenzione perché poi dovete verificare se il server vi ha risposto in un formato compresso o meno. L'errore classico è quindi quello di leggere tutti i dati dallo stream di risposta e poi trovarsi con tanti bei quadratini :D, una soluzione è quella di fare una funzione particolare per recuperare lo stream di risposta.


Private Function GetResponseStream(ByVal wc As WebClient, ByVal Url As String) As Stream

    Dim returnStream As Stream = wc.OpenRead(Url)
    'first of all, the content is somewath compressed?
    If wc.ResponseHeaders(HttpResponseHeader.ContentEncodingIsNot Nothing Then
        'I have an encoding, so I need to decode
        Dim transferEncoding As String = wc.ResponseHeaders(HttpResponseHeader.ContentEncoding)
        If String.Compare(transferEncoding, "deflate"True) = 0 Then
            'Simply deflate
            returnStream = New System.IO.Compression.DeflateStream(returnStream, Compression.CompressionMode.Decompress)
        ElseIf String.Compare(transferEncoding, "gzip"True) = 0 Then
            returnStream = New System.IO.Compression.GZipStream(returnStream, Compression.CompressionMode.Decompress)
        Else
            Throw New ApplicationException("The server respond with an unknown transfer encoding: " + transferEncoding)
        End If
    End If
    Return returnStream
End Function

In questo modo si prende come primo passo lo stream binario restituito dal server, poi controlliamo nella lista dei ResponseHeader se è presente il ContentEncoding e poi semplicemente andiamo a vedere se è uno di quelli supportati, e wrappiamo il nostro stream in un DeflateStream oppure in un GZipStream ed il gioco è fatto.

Ora vi rimane solamente da capire come convertire in stringa tutti quei brutti byte che vi restituisce il server (provate un sito unicode come www.sony.js) :D.

Alk.

Print | posted on giovedì 31 gennaio 2008 20:01 | Filed Under [ .NET ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET