HttpClient получает тайм-аут даже после установки Timeout.Infinite - PullRequest
0 голосов
/ 23 января 2019

Я использую HttpClient для получения данных с сервера в Xamarin Forms, используя следующий код

public  Task<HttpResponseMessage> sendData(String url,String jsonData)
    {

        using (var client = new HttpClient())
        {

            var jsonContent = new StringContent(jsonData, System.Text.Encoding.UTF8, "application/json");

            client.Timeout = TimeSpan.FromMilliseconds(Timeout.Infinite);
            client.BaseAddress = new Uri(baseAddress);

            return  client.PostAsync(new Uri(url, UriKind.Relative), jsonContent);
        }
    }

Здесь я использовал Timeout.Infinite, так как веб-сервису требуется около 4 минут для возврата ответа, но, хотя я установил, Timeout.Infinite приложение выдает Operation time out исключение. Я пытался использовать различные таймауты, такие как 240000ms, но все еще получал тайм-аут операции.

Однако, когда я пытаюсь выполнить тот же запрос в почтальоне, он работает, но да, возвращает ответ через 4 минуты. Поскольку это сторонний API, мы ничего не можем изменить там.

Может кто-нибудь предложить, как я могу заставить HttpClient держать больше для ответа.

Подробное исключение, которое я получаю

{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 
--- End of stack trace from previous location where exception was thrown ---
  at SignodeMSA.WebService.HttpService+<sendData>d__13.MoveNext () [0x0009c] in D:\VsualStudioWorkspace\SignodeMSA\SignodeMSA\SignodeMSA\WebService\HttpService.cs:141 
--- End of stack trace from previous location where exception was thrown ---
  at SignodeMSA.WebService.RestApi+<sendDataSimple>d__96.MoveNext () [0x000b3] in D:\VsualStudioWorkspace\SignodeMSA\SignodeMSA\SignodeMSA\WebService\RestApi.cs:199 }

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Я попробовал следующий код для Android и iOS, и он, кажется, работает и может немного подождать в сокете при извлечении данных с помощью веб-службы.

в Xamarin.Android, следующий код используется и отображается с помощью DependencyService

 public HttpClientHandler GetHttpClientHandler()
        {

            Xamarin.Android.Net.AndroidClientHandler http = new Xamarin.Android.Net.AndroidClientHandler();
            http.ReadTimeout = TimeSpan.FromMinutes(5.0);   


            return http;
        }

в Xamarin.iOS используется следующий код и отображается его с помощью DependencyService

HttpMessageHandler IHttpHandler.GetHttpHandler()
{


    NSUrlSessionConfiguration sessionConfig = NSUrlSessionConfiguration.DefaultSessionConfiguration;
    sessionConfig.TimeoutIntervalForRequest = 300;
    sessionConfig.TimeoutIntervalForResource = 300;
    sessionConfig.WaitsForConnectivity = true;


    NSUrlSessionHandler sessionHandler = new NSUrlSessionHandler(sessionConfig);

    return (sessionHandler);
}

Примечание: в случае iOS он вернет HttpMessageHandler

Использование в Xamarin.Forms

   HttpClient client = new HttpClient(DependencyService.Get<IHttpClientHandler>().GetHttpClient());

Однако здесь есть одна загвоздка, в случае iOS, если приложение извлекает данные с помощью HttpClient и если пользователь блокирует экран, нажимая клавишукнопка блокировки в айфоне, после чего сервис немедленно прерывается и выдает Connection Interrupted, а сокет закрывается.если кто-то может найти какое-либо решение для этого, то не стесняйтесь писать

0 голосов
/ 23 января 2019

Попробуйте использовать InfiniteTimeSpan из пространства имен System.Threading.Timeout.

client.Timeout = System.Threading.Timeout.InfiniteTimeSpan;

Я использую его в своих проектах Xamarin, и, похоже, он работает нормально.

...