HttpWebOperation超时。为什么要检查什么?

时间:2012-02-07 00:30:55

标签: c# .net http httpwebrequest

我正在调用这样的网络服务(我的网络服务):

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()

上获得超时

服务器端没有错误,事件日志中没有任何内容。感觉“某种东西”阻止我反复打击服务。我应该寻找什么?是否可以使用公司防火墙?或者我的代码出了什么问题?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

您应该按照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();

嗯。 doco也说

  

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

你应该要求某种锁定。

答案 2 :(得分:1)

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

看来很奇怪,就我所知,.net4上的webrequest基于较低层的IOCP,也许你可以尝试在每次循环后发布web请求/响应资源。

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

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