Истекло время ожидания запроса при использовании метода 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.HttpTransportAsyncResultResult (внутреннее) - --- Конец внутренней трассировки стека исключений --- в Microsoft.Http.AsyncResult.End [TAsyncResult] (результат IAsyncResult, Boolean throwException) в Microsoft.Http.HttpWebRequestTransportStage.EndProcessRequestAndTryGetResponse, состояние и ответ HttpessRequestResponse (IAsyncResult) в Microsoft.Http.HttpWebRequestTransportStage.ProcessRequestAndTryGetResponse (запрос HttpRequestMessage, HttpResponseM essage & response, Object & state) в Microsoft.Http.HttpStageProcessingAsyncResult.NextRequest (HttpStageProcessingAsyncResult self) --- Конец трассировки стека внутренних исключений --- в Microsoft.Http.HttpStageProcessingAsyncResult.Complete (HttpStage) на этапе Microsoft.HttpStage. HttpStageProcessingAsyncResult.NextRequest (HttpStageProcessingAsyncResult self) в Microsoft.Http.HttpClient.Send (запрос HttpRequestMessage) в Microsoft.Http.HttpClient.Send (HttpMethod method, в HttpClient.Content, UritentHttpMethod content, UritentMethod content, UritentHttpMethod метод, UritentMethod Content) client, метод HttpMethod, Uri uri, тело HttpContent) в Microsoft.Http.HttpMethodExtensions.Method (клиент HttpClient, метод HttpMethod, String 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 результат, Func3 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.AsyncResult1.End (IAsyncResult результат ) при Microsoft.Http.HttpWebRequestTransportStage.EndProcessRequestAndTryGetResponse (IAsyncResult результат, HttpResponseMessage & ответ, Object & состояние) в Microsoft.Http.HttpWebRequestTransportStage.ProcessRequestAndTryGetResponse (HttpRequestMessage запрос, HttpResponseMessage & ответ, Object & состояние) в Microsoft.Http.HttpStageProcessingAsyncResult.NextRequest (HttpStageProcessingAsyncResult само) - - Конец трассировки стека внутреннего исключения --- в Microsoft.Http.HttpStageProcessingAsyncResult.Complete (стадия HttpStage, исключение e) в Microsoft.Http.HttpStageProcessingAsyncResult.NextRequest (HttpStageProcessingAsyncResult self) в Microsoft. Http. Microsoft.Http.HttpClient.Send (метод HttpMethod, Uri uri, содержимое HttpContent) в Microsoft.Http.HttpMethodExtensions.Method (клиент HttpClient, метод HttpMethod, Uri uri, тело HttpContent) в Microsoft client.Http.HttpContent, Microsoft. HttpMethod, String uri, HttpContent body) в Microsoft.Http.HttpMethodExtensions.Post (HttpClient client, String uri, HttpContent body)

Любая помощь в этом отношении будет принята с благодарностью, потому что я после этого в течение последних нескольких дней, и я также прочитал некоторые статьи и даже вопросы в stackoverflow, но мне ничего не помогло. Заранее спасибо...


person Anish Kurian    schedule 04.10.2012    source источник
comment
Комментарий, который нужно добавить: - Публикуется ровно 2 раза. Не 2 или 3 раза. Извините за неточность.   -  person Anish Kurian    schedule 04.10.2012
comment
Под вашим контролем находится этот прокси / или удаленный компьютер? В этом случае вы проверяли, какое значение для интервала тайм-аута подключения установлено на этой машине? Это не похоже на проблему в вашем коде (кроме того факта, что вы должны обработать ошибку и повторить попытку)   -  person Niyaz    schedule 05.10.2012
comment
Но мы по-прежнему считаем, что проблема в нашем коде ... Значит, должно быть что-то, что мы упускаем - что связано с использованием ресурсов или что-то в этом роде. Я говорю это потому, что это хорошо работает каждый раз, когда мы перезапускаем пул приложений. Если снова истечет время ожидания и мы перезапустим пул приложений, все заработает. Это заставило нас поверить в то, что в этом HttpClient должно быть что-то, чего нам не хватает. Он не имеет никакого отношения к значению тайм-аута сервера. Это связано с тем, что из журнала сервера мы могли обнаружить, что запрос (время ожидания которого истекло) не дошел до сервера.   -  person Anish Kurian    schedule 05.10.2012


Ответы (1)


Правила прокси некоторых компаний вызывают проблемы с запросами POST.

Запросы GET работают нормально. Убедитесь, что настройка прокси в вашей ОС отключена.

Windows 7: Панель управления> Свойства обозревателя> Подключения (вкладка).

Затем нажмите кнопку «Настройки локальной сети» и снимите флажок «Использовать прокси-сервер для вашей локальной сети».

В качестве альтернативы попробуйте попросить сетевых администраторов добавить соединение, которое вы используете, в список исключений.

person Aidan Host    schedule 07.03.2013