C# HttpWebRequest在第二次调用Web服务器时超时

C# HttpWebRequest在第二次调用Web服务器时超时,c#,python,.net,httpwebrequest,C#,Python,.net,Httpwebrequest,我这里有一个非常奇怪的问题: 在Python-Pasteweb服务器上有一个RESTfull web服务,WPF.net应用程序每2秒向服务器发出一个httppost请求。问题是在第二次调用服务器时,请求超时!有时以后(比如说第四次或第五次)请求会一次又一次地工作,我会得到这个“超时”异常 IntelliTrace显示在ws2_32.dll中有一个被阻止的操作: 阻塞操作被对的调用中断 WSACancelBlockingCall 我使用asp.net在IIS上模拟了RESTWeb服务器,问题不再

我这里有一个非常奇怪的问题:

Python-Paste
web服务器上有一个RESTfull web服务,WPF.net应用程序每2秒向服务器发出一个httppost请求。问题是在第二次调用服务器时,请求超时!有时以后(比如说第四次或第五次)请求会一次又一次地工作,我会得到这个“超时”异常

IntelliTrace显示在
ws2_32.dll
中有一个被阻止的操作:

阻塞操作被对的调用中断 WSACancelBlockingCall

我使用
asp.net
在IIS上模拟了RESTWeb服务器,问题不再存在,因此我假设它可能是Python服务器配置!但是当我从浏览器中发出请求时,Python Web服务器工作正常

但是,我在.net客户端应用程序中尝试了不同的方法:

  • 我已增加了ServicePoint的
    DefaultConnectionLimit

    ServicePointManager.DefaultConnectionLimit=500

  • 我为服务器的任何新请求创建了一个新线程,并在请求完成时中止它

  • 我在任何请求之前创建了一个新的
    AppDomain
    ,并在处理完成后显式卸载它

  • 尝试了不同的http请求头:
    connection=keep-alive,accept=*

以上这些似乎都不起作用!然而有趣的是,当我在VS 2012中为
GetRequestStream()
行设置断点时,请求dos没有超时并且工作正常

使用反射调试.net托管代码我发现
ws2_32.dll
的非托管
recv
方法会导致操作阻塞,因此web请求超时

这是C代码:


我能做些什么来实现这一点吗?

我通过禁用
Expect100Continue
标题解决了这个问题:

ServicePointManager.Expect100Continue = false;
根据
http1.1
协议,当发送此报头时,使用POST方法的客户端请求期望从服务器接收
100 Continue
响应,以指示客户端应发送要发布的数据


如果将此属性设置为
true
(这是.Net的默认行为),则不会随初始请求一起发送数据。相反,此头被发送到web服务器,如果执行正确,该服务器将响应
100 Continue
。但是,并非所有web服务器都能正确处理此问题,包括我试图向其发布数据的服务器。我使用
Fiddler
嗅探了这些头,注意到我的代码确实发送了这个头,而
Python粘贴
没有

我通过禁用
Expect100Continue
标题解决了这个问题:

ServicePointManager.Expect100Continue = false;
根据
http1.1
协议,当发送此报头时,使用POST方法的客户端请求期望从服务器接收
100 Continue
响应,以指示客户端应发送要发布的数据

如果将此属性设置为
true
(这是.Net的默认行为),则不会随初始请求一起发送数据。相反,此头被发送到web服务器,如果执行正确,该服务器将响应
100 Continue
。但是,并非所有web服务器都能正确处理此问题,包括我试图向其发布数据的服务器。我使用
Fiddler
嗅探了这些头,注意到我的代码确实发送了这个头,而
Python粘贴
没有