我在这里遇到了一个非常奇怪的问题:
在Python Paste
Web服务器上有一个RESTfull Web服务,WPF .net应用程序每2秒向服务器发出一次http POST请求。问题是在第二次调用服务器时,请求超时!有时后来(说第四或第五)请求再次工作,之后我再次获得这个“超时”例外!
IntelliTrace显示ws2_32.dll
中存在阻止的操作:
通过调用来中断阻塞操作 WSACancelBlockingCall
我使用asp.net
在IIS上模拟REST Web服务器,问题不再存在,所以我假设它可能是Python服务器配置!但是当我在浏览器中发出请求时,Python Web服务器正常工作!
但是我在.net客户端应用程序中尝试了不同的东西:
我增加了ServicePoint的DefaultConnectionLimit
:
ServicePointManager.DefaultConnectionLimit = 500;
我为服务器的任何新请求创建了一个新线程,并在请求完成后中止了它!
我在任何请求之前创建了一个新的AppDomain
,并在处理完成后明确地将其卸载了!
尝试了不同的http请求标头:connection=keep-alive, accept=*
上述所有内容似乎都无效!然而,有趣的是,当我在VS 2012中为GetRequestStream()
行设置断点时,请求 dos not 超时并且正常工作!
使用反射调试.net托管代码我认为recv
的非托管ws2_32.dll
方法导致操作被阻止,因此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!";
}
}
我可以做任何事情来完成这项工作吗?
答案 0 :(得分:1)
我设法修复了禁用Expect100Continue
标题的问题:
ServicePointManager.Expect100Continue = false;
根据HTTP 1.1
协议,当发送此标头时,使用POST方法的客户端请求期望从服务器接收100-Continue
响应,以指示客户端应将数据发送到发布。
将此属性设置为true
(这是.Net的默认行为)时,数据不会随初始请求一起发送。相反,如果正确实施,此标头将发送到Web服务器,并以100-Continue
响应。但是,并非所有Web服务器都能正确处理,包括我尝试发布数据的服务器。我使用Fiddler
嗅探了标题,注意到我的代码确实发送了这个标题,而Python Paste
则没有!