2010-02-11 9 views
10

Ich frage mich, ob Sie mir mit einem Fehler helfen können, den ich habe. Ich habe einen HTTP-Manager, den ich erstellt habe, der mir hilft, POSTing/Getting Daten von Websites zu behandeln. Es hat bis vor kurzem gut funktioniert, als ich versuche, eine Mischung aus beiden zu verwenden. Die erste Schleife funktioniert, in der zweiten Schleife hängt sie an HttpWebRequest.GetRequestStream(). Ich habe überall im Netz gelesen und habe keine echte Lösung gefunden. Im Folgenden sind die Codeblöcke für den Abruf/Empfangs:Weiß jemand, warum ich ein HttpWebRequest Timeout erhalte?

ASCIIEncoding encoding = new ASCIIEncoding(); 
byte[] buffer = encoding.GetBytes(_PostData); 

_HttpWebRequest = (HttpWebRequest)WebRequest.Create(_FetchUrl); 
_HttpWebRequest.Credentials = _Credentials; 
_HttpWebRequest.Method = _RequestType.ToString(); 
_HttpWebRequest.ContentType = "application/x-www-form-urlencoded"; 
_HttpWebRequest.ContentLength = buffer.Length; 
_HttpWebRequest.UserAgent = userAgent; 
_HttpWebRequest.CookieContainer = _CookieContainer; 
_HttpWebRequest.KeepAlive = false; 
_HttpWebRequest.AllowAutoRedirect = _AllowAutoRedirect; 
_HttpWebRequest.AutomaticDecompression = DecompressionMethods.GZip; 
_HttpWebRequest.ServicePoint.Expect100Continue = false; 

if (_RequestType.Equals(RequestTypes.POST)) 
{ 
    // Write POST 
Stream reqStream = _HttpWebRequest.GetRequestStream(); 
{ 
    reqStream.Write(buffer, 0, buffer.Length); 
    reqStream.Flush(); 
    reqStream.Close(); 
    } 
} 

Und die reponse:

HttpWebResponse httpWebResponse = (HttpWebResponse)_HttpWebRequest.GetResponse(); 
{ 
    Stream responseStream = httpWebResponse.GetResponseStream(); 
    { 
    if (_UseGzip) 
    { 
     if (httpWebResponse.ContentEncoding.ToLower().Contains("gzip")) 
     { 
     responseStream = new GZipStream(responseStream, CompressionMode.Decompress); 
     } 
     else 
     { 
     responseStream = new DeflateStream(responseStream, CompressionMode.Decompress); 
     } 
    } 

    if (responseStream != null) 
    { 
     StreamReader streamReader = new StreamReader(responseStream); 
     { 
     try 
     { 
      _PageContent = streamReader.ReadToEnd(); 
     } 
     finally 
     { 
      streamReader.Close(); 
      responseStream.Close(); 
      httpWebResponse.Close(); 
     } 
     } 
    } 
    else 
    { 
     _PageContent = string.Empty; 
    } 
    } 
} 
_HttpWebRequest.Abort(); 

jemand meinen Code sehen kann alle Mängel, warum hängt? Alle Streams werden geschlossen, ich habe die erlaubten Verbindungen auf über 100 gesetzt, ich verstehe nicht, warum das bricht.

+0

entfernen Haben Sie versucht, so etwas wie Wireshark, um zu sehen, welche Daten tatsächlich gesendet wird? – Foole

+0

Wenn Sie sagen, dass der Code das erste Mal funktioniert, aber auf dem zweiten hält, welche HTTP-Methoden verwenden Sie während der jeweiligen Anfragen? –

+0

Der Code hängt an einem Post, GET scheint gut zu funktionieren. Wenn ich den Code über Burp-Proxy ausführen, funktioniert es aus irgendeinem Grund gut? Vielleicht repariert der Proxy einige meiner Header, weil ich nicht verstehe, wie es einen Unterschied machen sollte. –

Antwort

11

Dies kann auf die Tatsache zurückzuführen sein, dass Sie nicht von Ihrer WebResponse oder Streams oder StreamReaders sind Entsorgung:

var request = WebRequest.Create(...); 
using (var response = request.GetResponse()) 
{ 
    using (var responseStream = response.GetResponseStream()) 
    { 
     using (var reader = new StreamReader(responseStream)) 
     { 
      // use the reader 
     } 
    } 
} 
+0

Ich werde die Anfrage abbrechen (keine dispose-Methode verfügbar) und alle verfügbaren Streams schließen. Ich habe auch versucht, alle Objekte auf null zu setzen und dann den GC am Ende jeder Anfrage anzurufen, um sie zu beseitigen, und dies hatte auch keine Auswirkungen. –

+2

@Paul: Sie müssen auch den 'StreamReader' entsorgen, da er' IDisposable' implementiert. Gleiches gilt für den Stream, den Sie nicht schließen, wenn eine Ausnahme ausgelöst wird. Das macht der 'using'-Block für Sie. Es stellt sicher, dass der Parameter Disposed, egal was ist. Sobald ich höre, dass der Code bei nachfolgenden Versuchen fehlschlägt, frage ich mich: "Was hat er _nicht_ bei dem _previous_ Versuch gemacht". Sehr oft lautet die Antwort: "Etwas wurde nicht entsorgt". –

2

Ich hatte das gleiche Problem. Ich habe alle Streams und die HttpWebResponse korrekt mit diesen Blöcken geschlossen (entsorgt). Das Problem bestand immer noch, als ich Anfragen, die von ThreadAbortExceptions abgebrochen wurden, mit Spam versorgte. Schließlich half es, myWebRequest.Abort() aufzurufen, als die ThreadAbortException auftrat! Hoffe das hilft.

0

Ich sehe, dass Sie verwenden:

HttpWebRequest.AutomaticDecompression = DecompressionMethods.GZip; 

Zusammen mit Ansatz manueller Dekompression:

 if (httpWebResponse.ContentEncoding.ToLower().Contains("gzip")) 
     { 
     responseStream = new GZipStream(responseStream, CompressionMode.Decompress); 
     } 
     else 
     { 
     responseStream = new DeflateStream(responseStream, CompressionMode.Decompress); 
     } 

Haben Sie nicht versuchen, wenn es wirklich darauf ankommt, aber ich benutze nur manuellen Ansatz und in ähnlichem Code, und es funktioniert gut. Tatsächlich habe ich hängendes Problem, aber nur mit einer Domäne, experimentierte mit Eigenschaften zeigte Unterschied.

Oh, und ich vermute, wenn Sie irgendeine Post Datenkomprimierung nicht verwenden, müssen Sie Inhaltscodierung Header