2012-10-09 32 views
11

Tôi đã viết một số mã để gửi và đọc văn bản từ người nghe. Điều này chạy tốt trên 1 và 2 trao đổi, nhưng trên gửi thứ 3 có một sự chậm trễ lâu dài giữa gọi GetRequestStream và thực tế bằng văn bản của dữ liệu.HttpWebRequest getRequestStream treo trên nhiều lần chạy

tôi đã vứt chiếc outstream trên gửi bên, cũng như người đọc dòng, và các dòng đầu vào ở phía bên đọc theo khuyến cáo ở đây: Does anyone know why I receive an HttpWebRequest Timeout?

và nó vẫn bị treo trên các nỗ lực thứ 3 để gửi thông tin. Nó chắc chắn dường như được treo tại GetRequestStrean trong 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); 
    } 
} 

Và đây là phần đọc:

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

Tôi cũng cố gắng thêm một ràng buộc IP End Point nhưng phải trung thực, tôi don không hiểu đầy đủ về đoạn mã này:

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

Bất kỳ trợ giúp nào được đánh giá cao.

Trả lời

10

Bạn vừa quên gọi HttpWebRequest.GetResponse và do đó hết giới hạn kết nối.

Vì vậy, bạn nên thay đổi mã của bạn như sau:

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

Ngoài ra, trong một số trường hợp, bạn có thể muốn điều chỉnh giới hạn kết nối mặc định: ServicePointManager.DefaultConnectionLimit

Hoặc sử dụng kết nối liên tục: HttpWebRequest.KeepAlive

+2

Tuyệt vời. Sửa lỗi. Cảm ơn rất nhiều. – user1731572

+1

Bạn cũng nên .Dispose() phản hồi, chúng tôi đã có mã tương tự và không xử lý phản hồi đã gây ra treo trên cùng một phương pháp. –

Các vấn đề liên quan