我正在使用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);
}
}
}
}
答案 0 :(得分:5)
我想我已经很晚了,但我仍想回答你的问题,可能对别人有帮助。默认情况下,您发出的HTTP请求是HTTP 1.1请求。默认情况下,HTTP 1.1请求具有Keep-Alive
连接。所以当你向同一个服务器.net框架提出太多请求时,只需要x不。请求。
您应该按response.Close()
您还可以指定可以同时发出的请求数。
ServicePointManager.DefaultConnectionLimit = 20;
请注意,您必须在提出第一个请求之前设置DefaultConnectionLimit
。你可以找到更多信息
here on msdn
答案 1 :(得分:2)
我所能看到的是GetRequestStreamCallback
你应该替换
postStream.Write(byteArray, 0, postData.Length);
通过
postStream.Write(byteArray, 0, byteArray.Length);
因为这些长度不一定相等。
答案 2 :(得分:0)
@Somnath 我不确定你是否找到了这个答案,但如果有其他人在这篇文章中偶然发现Somnath和我有同样的问题。
我们都尽力保持记忆清洁和清晰,但是如果我们确保在关闭之前清除流,我们总是会节省无法解释的问题。
替换它:
postStream.Write(byteArray, 0, byteArray.Length);
postStream.Close();
有了这个:
postStream.Write(byteArray, 0, byteArray.Length);
postStream.Flush();
postStream.Close();
答案 3 :(得分:-1)
我遵循了所有人提供的所有建议,但无法阻止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;