System.Net.Http.HttpClient not Respect timeout и использовать каждый раз значение по умолчанию - PullRequest
0 голосов
/ 23 января 2019

Я использую HttpClient для взаимодействия с веб-сервисом (написанным моей компанией) с большим количеством API. Все API-интерфейсы работают отлично, кроме случаев, когда один из них (больше и медленнее) занимает более 100 секунд, чтобы дать ответ, после того времени я получаю следующую ошибку (NB: если API-интерфейс занимает менее 100 секунд, все работает хорошо):

System.Net.Http.HttpRequestException: An error occurred while sending the request ---> System.Net.WebException: The operation has timed out.
  at System.Net.HttpWebRequest+<RunWithTimeoutWorker>d__241`1[T].MoveNext () [0x000c5] in <3e9b3e26c4694baab3f689687ad40612>:0 
--- End of stack trace from previous location where exception was thrown ---
  at System.Net.HttpWebRequest.EndGetResponse (System.IAsyncResult asyncResult) [0x00020] in <3e9b3e26c4694baab3f689687ad40612>:0 
  at System.Threading.Tasks.TaskFactory`1[TResult].FromAsyncCoreLogic (System.IAsyncResult iar, System.Func`2[T,TResult] endFunction, System.Action`1[T] endAction, System.Threading.Tasks.Task`1[TResult] promise, System.Boolean requiresSynchronization) [0x0000f] in <d4a23bbd2f544c30a48c44dd622ce09f>:0 
--- End of stack trace from previous location where exception was thrown ---
  at System.Net.Http.HttpClientHandler+<SendAsync>d__64.MoveNext () [0x0041d] in <25ebe1083eaf4329b5adfdd5bbb7aa57>:0 
   --- End of inner exception stack trace ---
  at System.Net.Http.HttpClientHandler+<SendAsync>d__64.MoveNext () [0x00478] in <25ebe1083eaf4329b5adfdd5bbb7aa57>:0 
--- End of stack trace from previous location where exception was thrown ---
  at System.Net.Http.HttpClient+<SendAsyncWorker>d__49.MoveNext () [0x000ca] in <25ebe1083eaf4329b5adfdd5bbb7aa57>:0 

Все тайм-ауты IIS и веб-сервиса установлены на 5 минут, поэтому я могу исключить, что это проблема тайм-аута веб-сервиса, и в приложении я установил тайм-аут HttpClient на 10 минут (но он не работает, даже если я установил это на 5 минут), как вы можете видеть в моем коде ниже. Что я делаю не так?

КОД:

var handler = new HttpClientHandler() { CookieContainer = cookie,
                                        MaxRequestContentBufferSize = 256000000,
                                        UseCookies = true,
};
HttpClient newclient = new HttpClient(handler);

newclient.Timeout = new TimeSpan(0, 10, 0); //That DIDN'T WORK :(

// ALL THE CODE I NEED TO BUILD MY JSON INSIDE jSoNToPost
//....
//....

//convert it to JSON acceptible content
HttpContent formContent = new StringContent(jSoNToPost, Encoding.UTF8, "application/json");

var uri = new Uri(Path.Combine(BaseUrl, "BIG_API_NAME"));

var response1 = await newclient.PostAsync(uri, formContent); // <-- THE EXCEPTION IS THROWN HERE!!!!!

if (response1.IsSuccessStatusCode)
{
    //Other Stuff
    //....
    //....
}
else
{
    //Other Stuff
    //....
    //....
}

СРЕДА:

Окно 10, Visual Studio 2017, Xamarin IOS и Android.

РЕДАКТИРОВАТЬ 2019-01-23 14: 21:

Тайм-аут 100 с - это тайм-аут HttpClient по умолчанию, поэтому

newclient.Timeout = new TimeSpan(0, 10, 0);

не перезаписывать значение по умолчанию.


Я понимаю, что такое InfiniteTimeSpan, и я стараюсь следовать обоим ответам в этой записи . Безуспешно :( По-прежнему отображается ошибка тайм-аута после 100 с.

...