HttpWebOperation超时.检查原因和内容

本文关键字:超时 检查 HttpWebOperation | 更新日期: 2023-09-27 18:23:38

我这样调用web服务(我的web服务):

var request = WebRequest.Create(Options.ServerUri + Options.AccountId + "/integration/trip") as HttpWebRequest;
request.Timeout = 20000; // 20 seconds should be plenty, no need for 100 seconds
request.ContentType = "application/json";
request.Headers.Add(HttpRequestHeader.Authorization, "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(Options.LoginName + ":" + Options.Password)));
request.Method = "POST";
var serializedData = (new JavaScriptSerializer()).Serialize(trip);
var bytes = Encoding.UTF8.GetBytes(serializedData);
request.ContentLength = bytes.Length;
var os = request.GetRequestStream();
os.Write(bytes, 0, bytes.Length);
os.Close();
request.GetResponse();
LoggingAndNotifications.LogAndNotify(string.Format("Success uploading trip: {0}", trip.TripId), false);
return true;

此代码重复调用以发布新对象。大约3次通话后,我开始在reguest.GetReponse() 上超时

服务器端没有错误,事件日志中也没有任何错误。感觉就像是"什么东西"阻止了我重复发球。我应该找什么?公司防火墙有可能吗?或者我的代码有问题?

HttpWebOperation超时.检查原因和内容

我认为问题在于您没有关闭响应。尝试按如下方式编辑代码:

var response = request.GetResponse() as HttpWebResponse;
response.Close();

您应该按照doco中的示例关闭响应。

WebRequest myRequest = WebRequest.Create("http://www.contoso.com");
// Return the response. 
WebResponse myResponse = myRequest.GetResponse();
// Code to use the WebResponse goes here.
// Close the response to free resources.
myResponse.Close();

嗯。文件还说

此类型的任何公共静态(在Visual Basic中共享)成员都是线程安全。任何实例成员都不能保证是线程安全

你可能应该要一把锁。

您确定这不是由服务器端错误引起的吗?

这似乎很奇怪,据我所知,.net4上的web请求是基于下层的IOCP的,也许你可以尝试在每个循环后释放web请求/响应资源。

由于GetResponse()将返回一个流,如果您不从中读取,则实际数据可能无法从服务器端传输到客户端。(我在尝试解析使用peek()的响应时发现了这一点,在调用read()之前,它总是返回一个无效值。)

因此,请尝试读取或关闭它。