我有个很奇怪的问题:
在Python Paste
web服务器上有一个RESTfull web服务,WPF.net应用程序每2秒向服务器发出一个httppost请求。问题是第二次调用服务器时,请求超时!有时稍后(比如第四或第五次)请求一次又一次地工作,我得到这个“超时”异常!在
IntelliTrace显示ws2_32.dll
中有一个被阻止的操作:
A blocking operation was interrupted by a call to WSACancelBlockingCall
我使用asp.net
模拟了IIS上的restweb服务器,问题已经不存在了,所以我假设可能是Python服务器配置!但是当我从浏览器中发出请求时,pythonweb服务器可以正常工作!在
不过,我在.net客户端应用程序中尝试了不同的方法:
我增加了服务点的DefaultConnectionLimit
:
ServicePointManager.DefaultConnectionLimit = 500;
我为服务器的任何新请求创建了一个新线程,并在请求完成后中止了它!
我在任何请求之前创建了一个新的AppDomain
,并在进程完成后显式地卸载了它!
尝试了不同的http请求头:connection=keep-alive, accept=*
以上这些似乎都不管用!然而有趣的是,当我在VS2012中为GetRequestStream()
行设置一个断点时,请求不超时,并且工作正常!在
使用反射调试.net托管代码我发现ws2_32.dll
的非托管recv
方法会导致操作阻塞,因此web请求超时!在
以下是C代码:
static void Main(string[] args)
{
Task.Run(() =>
{
while (true)
{
Thread.Sleep(2000);
Console.WriteLine(PostData());
}
});
Console.ReadLine();
}
public static string PostData()
{
try
{
var response = "";
var httpRequest = WebRequest.CreateHttp("http://remote_address");
httpRequest.ServicePoint.ConnectionLimit = 500;
httpRequest.Method = "POST";
httpRequest.ContentType = "application/x-www-form-urlencoded";
httpRequest.Timeout = 5000;
using (var writer = new StreamWriter(httpRequest.GetRequestStream()))
{
writer.Write("req=" + "[some parameters]");
}
using (WebResponse httpResponse = httpRequest.GetResponse())
{
using (var data = httpResponse.GetResponseStream())
{
StreamReader sr = new StreamReader(data, Encoding.UTF8);
response = sr.ReadToEnd();
}
httpResponse.Close();
}
return response;
}
catch (WebException ex)
{
return "time out!";
}
}
我能做些什么使这项工作成功吗?在
我设法解决了禁用
Expect100Continue
头的问题:根据
HTTP 1.1
协议,当这个头被发送时,使用POST方法的客户机请求期望从服务器接收100-Continue
响应,以指示客户机应该发送要发布的数据。在将此属性设置为}没有!在
true
(这是.Net的默认行为),数据不会随初始请求一起发送。相反,这个头被发送到web服务器,如果正确实现,它将用100-Continue
响应。但是,并不是所有的web服务器都能正确处理这个问题,包括我试图向其发布数据的服务器。我用Fiddler
嗅探了一下头,注意到我的代码确实发送了这个头,而{相关问题 更多 >
编程相关推荐