2010-08-10 4 views
1

J'utilise la classe WebRequest dans les données .net et POST sur un serveur qui répond avec une réponse.Problème WebRequest, réponse avant le corps de la demande

La chose la plus étrange est que ça marche quand j'ai commencé à analyser le trafic de mon réseau, mais sans fiddler ce n'est pas le cas. J'ai donc commencé à analyser le paquet qui est envoyé depuis et vers mon ordinateur avec WireShark. Avec dans ce programme, il est simple de suivre le flux TCP. Donc, quand j'ai eu un violoniste, je peux voir que l'en-tête/corps de requête correct est envoyé, et obtient l'en-tête/corps de réponse. La partie étrange est quand je n'utilise pas fiddler l'en-tête de demande est envoyé, alors j'ai l'en-tête/corps de réponse, et finalement le corps de demande à la fin du flux TCP.

Voici mon code que j'ai approfondirai:

string lcUrl = "http://XX.XX.XXX.XX"; 

     // *** Establish the request 

     HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl); 

     string lcPostData = testdata; 

     loHttp.Method = "POST"; 

     byte [] lbPostBuffer = System.Text.Encoding.GetEncoding(1252).GetBytes(lcPostData); 

     loHttp.ContentLength = lbPostBuffer.Length; 

     loHttp.Credentials = CredentialCache.DefaultCredentials; 

     //loHttp.SendChunked = true; 

     loHttp.ServicePoint.Expect100Continue = false; 

     Stream loPostData = loHttp.GetRequestStream(); 

     loPostData.Write(lbPostBuffer, 0, lbPostBuffer.Length); 

     loPostData.Close(); 

     HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse(); 

     Encoding enc = System.Text.Encoding.GetEncoding(1252); 

     StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc); 

     string lcHtml = loResponseStream.ReadToEnd(); 

     loWebResponse.Close(); 

     loResponseStream.Close(); 
+0

peut-être cela aide: http://stackoverflow.com/questions/18126941/c-sharp-webrequest-post-and-getresponse – xameeramir

Répondre

2

S'il vous plaît utiliser le code ci-dessous. Semble que vous avez des problèmes avec le temps lorsque les flux sous-jacents sont envoyés au serveur distant.

string lcUrl = "http://XX.XX.XXX.XX"; 
// *** Establish the request 
HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(lcUrl); 
string lcPostData = testdata; 
loHttp.Method = "POST"; 
byte[] lbPostBuffer = System.Text.Encoding.GetEncoding(1252).GetBytes(lcPostData); 
loHttp.ContentLength = lbPostBuffer.Length; 
loHttp.Credentials = CredentialCache.DefaultCredentials; 
//loHttp.SendChunked = true; 
loHttp.ServicePoint.Expect100Continue = false; 
using (Stream loPostData = loHttp.GetRequestStream()) 
{ 
    loPostData.Write(lbPostBuffer, 0, lbPostBuffer.Length); 
} 
string lcHtml; 
using (HttpWebResponse loWebResponse = (HttpWebResponse)loHttp.GetResponse()) 
{ 
    Encoding enc = System.Text.Encoding.GetEncoding(1252); 
    using (StreamReader loResponseStream = new StreamReader(loWebResponse.GetResponseStream(), enc)) 
    { 
     lcHtml = loResponseStream.ReadToEnd(); 
    }    
} 
// Perform processing of data here.... 

Je pourrais également vous suggérer d'ajouter le code suivant dans le fichier app.config pour votre application. Cela aide lorsque le serveur renvoie une réponse non conforme à la façon dont .NET gère la requête HTTP.

<configuration> 
<system.net> 
<settings> 
<httpWebRequest 
useUnsafeHeaderParsing="true" 
/> 
</settings> 
</system.net> 
</configuration> 
+0

Je suis désolé, mais ça n'a pas aidé beaucoup, je l'ai eu résultat comme avant .. requête/réponse imbriquée – Claysson

0

Je soupçonne que le client attend la réponse « HTTP/1.1 100 continue » du serveur. Voilà comment cela fonctionne. Lorsque vous envoyez des données au serveur, le serveur n'est peut-être pas toujours prêt à accepter les données. Par exemple, il veut d'abord authentifier le client. Ainsi, lorsque vous envoyez une requête POST, le client envoie simplement les en-têtes de requête, avec un "Expect: 100-continue" ajouté.

POST/url HTTP/1.1 serveur: serveur Nom/fqdn Content-Length: 100 Expect: 100-continue

Si le serveur est prêt à recevoir les données qu'il répond par:

HTTP/1.1 100 suite Serveur: nom-serveur/fqdn

Maintenant, le client peut envoyer les données. Toutefois, si le serveur n'est pas prêt à recevoir les données et veut authentifier le client, il répondra avec un code d'état différent.

Si vous postez votre trace wireshark à pastebin.com, je peux vérifier, mais je suppose que c'est ce qui se passe. La raison pour laquelle vous ne le voyez pas dans fiddler est peut-être que fiddler utilise HttpListener pour écouter la requête HTTP et que l'écouteur HTTP cache la réponse intermédiaire comme 100-continue depuis l'application (dans ce cas, fiddler).

+0

Je ne suis pas sûr de ce qu'est la trace? Comment l'obtenir de WireShark? – Claysson

+0

Cliquez simplement sur "suivre le flux TCP" comme vous l'avez déjà fait. Ensuite, copiez/collez cela dans un fichier texte et mettez le contenu sur pastebin.com – feroze

+0

Le problème est résolu, le problème a été trouvé dans le serveur et je ne sais pas quel genre de problème ils avaient. feroze, merci de prendre votre temps! – Claysson

Questions connexes