2009-11-16 4 views
0

J'écris un programme qui télécharge des pages Web. Cela fonctionne bien pour la plupart des pages Web, mais j'ai trouvé quelques pages où cela ne fonctionne pas.Réponse tronquée pour la page Web avec le caractère 0x00

Ces pages contiennent 0x00 caractères.

Je suis capable de lire le contenu de la page jusqu'à ce caractère, mais pas le contenu après.

-je utiliser cette partie du code pour lire la réponse:

IAsyncResult ar = null; 
HttpWebResponse resp = null; 
Stream responseStream = null; 
String content = null; 
... 
resp = (HttpWebResponse)req.EndGetResponse(ar); 
responseStream = resp.GetResponseStream(); 
StreamReader sr = new StreamReader(responseStream, Encoding.UTF8); 
content = sr.ReadToEnd(); 

Dans cet exemple, j'utilise requête asynchrone, mais j'essayer avec un synchrone et j'ai même Probleme.

J'essaie aussi cela avec le même résultat:

HttpWebResponse resp = null; 
Stream responseStream = null; 
String content = new String(); 
... 
responseStream = resp.GetResponseStream(); 
byte[] buffer = new byte[4096]; 
int bytesRead = 1; 
while (bytesRead > 0) 
{ 
    bytesRead = responseStream.Read(buffer, 0, 4096); 
    content += Encoding.UTF8.GetString(buffer, 0, bytesRead); 
} 

par exemple, le problème se produit pour cette url http://www.daz3d.com/i/search/searchsub?sstring=ps_tx1662b&_m=dps_tx1662b

Merci pour les réponses votres

Euyeusu

Répondre

1

Votre problème est pour transformer le contenu reçu en chaîne, où vous devez supprimer les 0x00 octets:

AutoResetEvent sync = new AutoResetEvent(false); 
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://..."); 
request.Proxy.Credentials = CredentialCache.DefaultCredentials; 
request.BeginGetResponse((result) => 
{ 
    StringBuilder content = new StringBuilder(); 
    using (HttpWebResponse response = 
      request.EndGetResponse(result) as HttpWebResponse) 
    using (Stream stream = response.GetResponseStream()) 
    { 
     int read = 1; 
     byte[] buffer = new byte[0x1000]; 
     while (read > 0) 
     { 
      read = stream.Read(buffer, 0, buffer.Length); 
      content.Append(Encoding.UTF8.GetString(buffer 
       .TakeWhile((b, index) => index <= read) 
       .Where(b => b != 0x00).ToArray())); 
     } 
     Console.WriteLine(content); 
     sync.Set(); 
    } 
}, null); 
sync.WaitOne(); 
0

C'est le codage qui échoue réellement. Pour contourner cela, vous devrez filtrer les 0x00 octets. Quelque chose comme ça devrait faire l'affaire:

using System.Net; 
using System.IO; 
using System.Text; 

WebRequest request = WebRequest.Create("url here"); 
WebResponse response = request.GetResponse(); 

string html; 
using (Stream stream = response.GetResponseStream()) 
{ 

    int index = -1, currentByte = 0; 
    byte[] buffer = new byte[response.ContentLength]; 
    while ((currentByte = stream.ReadByte()) > -1) 
    { 
     if(currentByte > 0) buffer[++index] = (byte)currentByte; 
    } 

    html = Encoding.ASCII.GetString(buffer, 0, index + 1); 
} 
Questions connexes