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=*
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粘贴
没有