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.ContentEncoding) IsNot 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.