【问题标题】:HttpWebRequest getRequestStream hangs on multiple runsHttpWebRequest getRequestStream 在多次运行时挂起
【发布时间】:2012-10-09 11:38:19
【问题描述】:

我编写了一些代码来发送和读取来自侦听器的文本。这在第 1 次和第 2 次交换时运行良好,但在第 3 次发送时,调用 GetRequestStream 和实际写入数据之间存在很长的延迟。

我已经按照此处的建议在发送端配置了外流、流读取器以及读取端的输入流: Does anyone know why I receive an HttpWebRequest Timeout?

它仍然在第三次尝试发送信息时挂起。它肯定似乎挂在 getRequestStrean 的 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);
    }
}

这是阅读部分:

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

我也尝试添加一个 IP 端点绑定,但老实说,我不完全理解这段代码:

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

非常感谢任何帮助。

【问题讨论】:

    标签: c# httpwebrequest


    【解决方案1】:

    您只是忘记拨打HttpWebRequest.GetResponse,因此连接数已用完。

    因此,您应该按如下方式更改代码:

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

    此外,在某些情况下,您可能需要调整默认连接限制: ServicePointManager.DefaultConnectionLimit

    或者使用持久连接: HttpWebRequest.KeepAlive

    【讨论】:

    • 太棒了。解决它。非常感谢。
    • 您还应该 .Dispose() 响应,我们有类似的代码,不处理响应会导致同一方法挂起。
    • @martinh_kentico 你的回答解决了我的问题!我没有处理响应。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 1970-01-01
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多