HttpWebOperation истекло. Зачем и что проверять? - PullRequest
0 голосов
/ 07 февраля 2012

Я звоню в веб-сервис (мой веб-сервис) так:

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 ]

2 голосов
/ 07 февраля 2012

Я думаю, проблема в том, что вы не закрываете ответ.Попробуйте отредактировать ваш код следующим образом:

var response = request.GetResponse() as HttpWebResponse;
response.Close();
1 голос
/ 07 февраля 2012

Вы уверены, что это не вызвано ошибками на стороне сервера?

Кажется странным, насколько мне известно, веб-запрос на .net4 основан на IOCP на нижнем уровне, возможно, вы можете попытаться освободить ресурсы веб-запросов / ответов после каждого цикла.

Поскольку GetResponse () будет возвращать поток, если вы не читаете с него, реальные данные могут не передаваться с сервера на клиентскую сторону. (Я обнаружил это, когда пытаюсь проанализировать ответ, который использовал peek (), и он всегда возвращает недопустимое значение, пока не будет вызван read ().)

Итак, попробуйте прочитать или просто закройте его.

1 голос
/ 07 февраля 2012

Вы должны закрыть ответ согласно примеру в 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();

Хм. Доко также говорит

Любые открытые статические (Shared в Visual Basic) члены этого типа Поток безопасно. Любые члены экземпляра не гарантированно являются потоками сейф.

Возможно, вам следует попросить какой-нибудь замок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...