2012-10-09 9 views
11

Ich habe etwas Code geschrieben, um Text von einem Listener zu senden und zu lesen. Dies läuft am 1. und 2. Austausch, aber am 3. senden gibt es eine lange Verzögerung zwischen dem Aufruf von GetRequestStream und dem tatsächlichen Schreiben der Daten.HttpWebRequest getRequestStream hängt bei mehreren Läufen

Ich habe die outStream auf der Sendeseite angeordnet ist, sowie die Stromleser, und den Eingangsstrom auf der Leseseite wie hier empfohlen: Does anyone know why I receive an HttpWebRequest Timeout?

und es hängt immer noch auf dem dritten Versuch zu senden Info. Es scheint auf jeden Fall bei GetRequestStrean in nachrichts zu hängen:

public void sendMessage(string message) 
{ 
    HttpWebRequest request; 
    string sendUrl; 

    sendUrl = "http://" + termIPAddress + ":" + sendPort + "/"; 
    Uri uri = new Uri(sendUrl); 
    Console.WriteLine("http://" + termIPAddress + ":" + sendPort + "/"); 

    ServicePoint servicePoint = ServicePointManager.FindServicePoint(uri); 
    servicePoint.BindIPEndPointDelegate = new BindIPEndPoint(BindIPEndPointCallback); 
    servicePoint.ConnectionLeaseTimeout = 300; 


    request = (HttpWebRequest)WebRequest.Create(sendUrl); 
    request.KeepAlive = false; 
    request.Method = "POST"; 
    request.ProtocolVersion = HttpVersion.Version11; 
    request.ContentType = "application/x-www-form-urlencoded"; 
    request.Headers.Add("SourceIP", localIPAddress); 
    request.Headers.Add("MachineName", localName); 
    requestStarted = true; 


    byte[] buffer = System.Text.Encoding.UTF8.GetBytes(message); 
    request.ContentLength = buffer.Length; 
    try 
    { 
     using (Stream output = request.GetRequestStream()) 
     { 
      output.Write(buffer, 0, buffer.Length); 
      output.Close(); 
      request = null; 
     } 
    } 
    catch(WebException wE) 
    { 
     Console.WriteLine(wE.Message); 
    } 
} 

Und dies ist der Leseteil:

public string getMessage() 
{ 
    Console.WriteLine("Entering actual listener"); 
    string s; 
    string sourceIP; 

    NameValueCollection headerList; 

    HttpListenerContext context = terminalListener.GetContext(); 
    HttpListenerRequest request = context.Request; 

    headerList = request.Headers; 
    sourceIP = headerList.GetValues("SourceIP")[0]; 
    termName = headerList.GetValues("MachineName")[0]; 
    termIPAddress = sourceIP; 
    using (System.IO.Stream body = request.InputStream) 
    { 
     System.Text.Encoding encoding = request.ContentEncoding; 
     using (System.IO.StreamReader reader = new System.IO.StreamReader(body, encoding)) 
     { 
      s = reader.ReadToEnd(); 
      body.Close(); 
      reader.Close(); 
     } 
    } 

    return termName + " : " + s;  
} 

Ich habe auch versucht, eine IP-End Point binden hinzuzufügen, aber ehrlich sein müssen, ich don verstehe dieses Teil des Codes nicht vollständig:

private IPEndPoint BindIPEndPointCallback(ServicePoint servicePoint, IPEndPoint remoteEndPoint, int retryCount) 
{ 
    int portNumber = Convert.ToInt32(sendPort); 
    IPEndPoint IEP = new IPEndPoint(IPAddress.Parse(localIPAddress), 0); 
    Console.WriteLine(Convert.ToString(IEP)); 
    return IEP; 
} 

Jede Hilfe sehr geschätzt.

Antwort

10

Sie haben gerade vergessen, HttpWebRequest.GetResponse anzurufen und daher keine Verbindung mehr zu haben.

Also, sollten Sie Ihren Code wie folgt ändern:

try 
{ 
    using (Stream output = request.GetRequestStream()) 
     output.Write(buffer, 0, buffer.Length); 

    var response = request.GetResponse() as HttpWebResponse; 
    //TODO: check response.StatusCode, etc. 
} 
catch(WebException wE) 
{ 
    Console.WriteLine(wE.Message); 
} 

Auch in einigen Fällen möchten Sie vielleicht Standardverbindungslimit anzupassen: ServicePointManager.DefaultConnectionLimit

Oder verwenden persistente Verbindungen: HttpWebRequest.KeepAlive

+2

Großartig. Behoben. Danke vielmals. – user1731572

+1

Sie sollten auch .Dispose() die Antwort, wir hatten ähnlichen Code und nicht die Beseitigung der Antwort verursacht hängt auf der gleichen Methode. –

Verwandte Themen