Тайм-аут запроса при использовании метода Post HttClient в C#
В моем приложении я использую фрагмент кода для отправки контента на веб-прокси с URL-адресом с интервалом 2 секунды между каждым сообщением. Сообщение для публикации в приведенном ниже коде дается в виде статической строки, но будет динамическим в исходном коде приложения.
for (ic = 0; ic < 30; ic++)
{
using(HttpClient httpClient = new HttpClient())
{
Encoder encoder = new Encoder(); //This is a class which we created
AuthorizationHeaders authorizationHeaders = encoder.getAuthorization(PARTNER_ID, PARTNER_KEY, URL, "POST", "application/xml");
httpClient.DefaultHeaders.Add("Accept", "*/*");
httpClient.DefaultHeaders.Add("Authorization", authorizationHeaders.getAuthorizationHeader());
httpClient.DefaultHeaders.Add("Expires", authorizationHeaders.getExpiresHeader());
httpClient.DefaultHeaders.Add("origPartnerId", "MyWebSite");
httpClient.DefaultHeaders.Add("appId", "440");
httpClient.DefaultHeaders.Add("Content-Type", "application/xml");
string inputUrl = ConfigurationManager.AppSettings["url"];
String detailRequest = "<?xml version=\"1.0\" encoding=\"utf-8\"?><Message><Details><Name>Bob</Name><Age>45</Age></Details></Message>";
var content = HttpContent.Create(detailRequest, Encoding.UTF8, "application/xml");
response = httpClient.Post(inputUrl, content).EnsureStatusIsSuccessful();
Thread.Sleep(2000);
}
}
Но я получаю следующее исключение при обращении к прокси. Я не получаю это все время, сообщение проходит через некоторое время, но в конце концов, это исключение приходит.
Тайм-аут GetResponse ---> System.TimeoutException: Тайм-аут GetResponse ---> System.Net.WebException ---> System.Net.WebException: Тайм-аут операции для System.Net.HttpWebRequest.GetResponse() в Microsoft.Http.HttpWebRequestTransportStage.HttpTransportAsyncResult.PopulateWebResponseSync(запрос WebRequest, результат IAsyncResult) в Microsoft.Http.HttpWebRequestTransportStage. Исключение - Конец трассировки стека внутренней исключительной ситуации --- в Microsoft.Http.AsyncResult.End [TAsyncResult] (результат IAsyncResult, Boolean throwException) в Microsoft.Http.HttpWebRequestTransportStage. Http.HttpWebRequestTransportStage.ProcessRequestAndTryGetResponse (запрос HttpRequestMessage, HttpResponseMessage& response, Object & state) в Microsoft.H ttp.HttpStageProcessingAsyncResult.NextRequest (HttpStageProcessingAsyncResult self) --- Конец внутренней трассировки стека исключений --- в Microsoft.Http.HttpStageProcessingAsyncResult.Complete(этап HttpStage, исключительная ситуация Microsoft)..Http.HttpClient.Send (запрос HttpRequestMessage) в Microsoft.Http.HttpClient.Send (метод HttpMethod, Uri uri, заголовки RequestHeaders, содержимое HttpContent) в Microsoft.Http.HttpMethodExtenho, метод Http, Http body) в Microsoft.Http.HttpMethodExtensions.Method (клиент HttpClient, метод HttpMethod, строковый URI, тело HttpContent)
Но этот прокси - просто перенаправление на другой. Так что я тоже попытался это сделать. Там я смог сделать это 2 или 3 раза успешно, но после этого возникло еще одно исключение. Я попробовал еще раз, но на этот раз исключение пришло для самой первой попытки. Я подождал некоторое время и затем попытался снова, и удивительно, это действительно прошло 2 или 3 раза, и затем снова пришло исключение. Исключение, которое я получаю в этот раз, отличается, и именно это...
Microsoft.Http.HttpStageProcessingException ---> System.Net.WebException ---> System.Net.WebException: базовое соединение было закрыто: соединение было неожиданно закрыто. на System.Net.HttpWebRequest.GetResponse() в Microsoft.Http.HttpWebRequestTransportStage.HttpTransportAsyncResult.PopulateWebResponseSync(WebRequest запрос, IAsyncResult результат) в Microsoft.Http.HttpWebRequestTransportStage.HttpTransportAsyncResult.PopulateWebResponse(HttpTransportAsyncResult себя, IAsyncResult результат, Func 3 getResponse) --- End of inner exception stack trace --- at Microsoft.Http.AsyncResult.End[TAsyncResult](IAsyncResult result, Boolean throwException) at Microsoft.Http.AsyncResult.End[TAsyncResult](IAsyncResult result) at Microsoft.Http.AsyncResult
1.End (IAsyncResult результат) в Microsoft.Http.HttpWebRequestTransportStage.EndProcessRequestAndTryGetResponse(IAsyncResult результат, HttpResponseMessage& ответ, объект и состояние) в Microsoft.Http.HttpWebRequestTransportStage.ProcessRequestAndTryGetResponse(HttpRequestMessage запрос, HttpResponseMessage& ответ, объект и состояние) в Microsoft.Http.HttpStageProcessingAsyncResult.NextRequest(HttpStageProcessingAsyncResult self)
--- Конец трассировки стека внутренней исключительной ситуации --- в Microsoft.Http.HttpStageProcessingAsyncResult.Complete(этап HttpStage, исключительная ситуация e) в Microsoft.Http.HttpStageProcessingAsyncRestingSyncProcessHackPorting.HecTPHext.HP..ctor (состояние HttpStageProcessingAsyncState, обратный вызов AsyncCallback, пользователь объекта) в Microsoft.Http.HttpClient.Send (запрос HttpRequestMessage) в Microsoft.Http.HttpClient.Send (метод HttpMethod, Uri uri, заголовок Http)..HttpClient.Send (HttpMethod m ethod, Uri uri, содержимое HttpContent) в Microsoft.Http.HttpMethodExtensions.Method (клиент HttpClient, метод HttpMethod, Uri uri, тело HttpContent) в Microsoft.Http.HttpMethodExtensions.Method, метод Httpring, HttpTent в Microsoft.Http.HttpMethodExtensions.Post(клиент HttpClient, строковый URI, тело HttpContent)
Любая помощь в этом отношении будет принята с благодарностью, потому что я следил за этим в течение последних нескольких дней, и я также прочитал некоторые статьи и даже вопросы по stackru, но ничего не помогло мне. Заранее спасибо...
1 ответ
Правила прокси некоторых компаний вызовут проблемы с запросами POST.
GET запросы работают нормально. Убедитесь, что настройки прокси-сервера вашей ОС отключены.
Windows 7: Панель управления> Свойства обозревателя> Подключения (вкладка).
Затем нажмите кнопку "Настройки локальной сети" и снимите флажок "Использовать прокси-сервер для вашей локальной сети".
Или попробуйте, чтобы ваши сетевые администраторы добавили соединение, которое вы используете, в список исключений.