2012-10-09 29 views
11

He escrito un código para enviar y leer texto de un oyente. Esto funciona bien en el primer y segundo intercambio, pero en el tercer envío hay una larga demora entre llamar a GetRequestStream y la escritura real de los datos.HttpWebRequest getRequestStream se cuelga en varias ejecuciones

he dispuesto el outStream en el lado de envío, así como el lector corriente, y la corriente de entrada en el lado de lectura como se recomienda aquí: Does anyone know why I receive an HttpWebRequest Timeout?

y todavía cuelga en el 3er intento de enviar información Definitivamente parece estar colgando en GetRequestStrean en sendMessage:

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); 
    } 
} 

Y esta es la parte de lectura:

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;  
} 

También probé para añadir un aprieto IP de punto final, pero tienen que ser honesta, Don No entiendo completamente esta parte del código:

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; 
} 

Cualquier ayuda muy apreciada.

Respuesta

10

Acaba de olvidarse de llamar al HttpWebRequest.GetResponse y, por lo tanto, se queda sin límite de conexión.

lo tanto, debe cambiar el código de la siguiente manera:

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); 
} 

Además, en algunos casos es posible que desee ajustar límite de conexiones por defecto: ServicePointManager.DefaultConnectionLimit

o utilizar conexiones persistentes: HttpWebRequest.KeepAlive

+2

Genial. Arreglado. Muchas gracias. – user1731572

+1

También debe. Desechar() la respuesta, tuvimos código similar y no descartar que la respuesta estuviera causando bloqueos en el mismo método. –

Cuestiones relacionadas