繁体   English   中英

HttpWebRequest突然停止工作,几个请求后没有收到响应

[英]HttpWebRequest stops working suddenly, No response received after few requests

我正在使用WPF .net 4.0应用程序。 我有一个搜索栏。 对于每个搜索令牌,我需要对8个单独的URL执行8个http请求以获取搜索结果。 一旦用户停止在搜索栏中输入,我会在400毫秒后向服务器发送8个请求。 搜索6到7个搜索令牌的结果非常好。 但在那之后突然HttpWebRequest停止了默默工作。 没有例外,没有收到任何回复。 我正在使用Windows 7,我也禁用了防火墙。 我不知道后续的http请求丢失在哪里。

任何人都可以向我展示灯来解决这个问题吗?

下面是我的HttpWebRequest调用代码。

public static void SendReq(string url)
{
    // Create a new HttpWebRequest object.
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

    request.ContentType = "application/x-www-form-urlencoded";
    request.Proxy = new WebProxy("192.168.1.1", 8000);

    // Set the Method property to 'POST' to post data to the URI.
    request.Method = "POST";

    // start the asynchronous operation
    request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);

}

private static void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

    // End the operation
    Stream postStream = request.EndGetRequestStream(asynchronousResult);

    string postData = this.PostData;

    // Convert the string into a byte array. 
    byte[] byteArray = Encoding.UTF8.GetBytes(postData);

    // Write to the request stream.
    postStream.Write(byteArray, 0, byteArray.Length);
    postStream.Close();

    // Start the asynchronous operation to get the response
    request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
}

private static void GetResponseCallback(IAsyncResult asynchronousResult)
{
    HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState;

    // End the operation
    using(HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult))
    {
        using(Stream streamResponse = response.GetResponseStream())
        {
             using(StreamReader streamRead = new StreamReader(streamResponse))
             {
                 string responseString = streamRead.ReadToEnd();
                 Debug.WriteLine(responseString);
             }
        }
    }
}

我想我已经很晚了,但我仍然想回答你的问题,可能对别人有帮助。 默认情况下,您发出的HTTP请求是HTTP 1.1请求。 默认情况下,HTTP 1.1请求具有Keep-Alive连接。 所以当你向同一个服务器.net框架提出太多请求时,只需要x不。 请求。

你应该通过response.Close()关闭你的所有响应

您还可以指定可以同时发出的请求数。

ServicePointManager.DefaultConnectionLimit = 20;

请注意,您必须在第一个请求之前设置DefaultConnectionLimit 你可以在这里找到更多关于msdn的信息。

我只能看到你应该替换GetRequestStreamCallback

postStream.Write(byteArray, 0, postData.Length);

通过

postStream.Write(byteArray, 0, byteArray.Length);

因为这些长度不一定相等。

@Somnath我不确定你是否找到了这个答案,但是如果有其他人在这篇文章中偶然发现Somnath和我有同样的问题。

我们都尽力保持记忆清洁和清晰,但如果我们确保在关闭之前清除流,我们总是会节省无法解释的问题。

替换这个:

postStream.Write(byteArray, 0, byteArray.Length);
postStream.Close();

有了这个 :

postStream.Write(byteArray, 0, byteArray.Length);
postStream.Flush();
postStream.Close();

我遵循了所有人提供的所有建议,但无法阻止HTTP请求的无声失败。 但我找到了一个解决方法。 甚至直到现在我都无法达成最终结论。

但我的解决方法现在运作良好,没有任何失败。

SendReq(string url)函数中,我添加了以下代码行

System.Net.ServicePointManager.DefaultConnectionLimit = 100; // Just selected a random number for testing greater than 2
System.Net.ServicePointManager.SetTcpKeepAlive(true, 30, 30); // 30 is based on my server i'm hitting
System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;

request.KeepAlive = true;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM