В Xamarin.Forms iOS, получение HttpRequestException: произошла ошибка при отправке запроса при блокировке устройства - PullRequest
1 голос
/ 23 января 2020

В Xamarin Forms iOS у меня есть страница, и я заполняю некоторую информацию, выбирая данные из API. При запуске страницы я делаю вызов API для события Appearing. В это время, прежде чем завершить загрузку страницы, заблокируйте устройство. В это время я сталкиваюсь с HttpRequestException: при отправке запроса произошла ошибка. Ниже приведены подробности исключений:

System.Net.WebConnection.CreateStream (System.Net.WebOperation operation, System.Boolean reused, System.Threading.CancellationToken cancellationToken) [0x00208] in /Library/Frameworks/Xamarin.iOS.framework/Versions/Current/src/Xamarin.iOS/mcs/class/System/System.Net/WebConnection.cs:234
at System.Net.WebConnection.InitConnection (System.Net.WebOperation operation, System.Threading.CancellationToken cancellationToken) [0x000f7] in /Library/Frameworks/Xamarin.iOS.framework/Versions/Current/src/Xamarin.iOS/mcs/class/System/System.Net/WebConnection.cs:263 
at System.Net.WebOperation.Run () [0x00052] in /Library/Frameworks/Xamarin.iOS.framework/Versions/Current/src/Xamarin.iOS/mcs/class/System/System.Net/WebOperation.cs:268 
at System.Net.WebCompletionSource`1[T].WaitForCompletion () [0x00094] in <3a248b3a8d824cb189d202decc560ac6>:0 
at System.Net.HttpWebRequest.RunWithTimeoutWorker[T] (System.Threading.Tasks.Task`1[TResult] workerTask, System.Int32 timeout, System.Action abort, System.Func`1[TResult] aborted, System.Threading.CancellationTokenSource cts) [0x000f8] in <3a248b3a8d824cb189d202decc560ac6>:0 
at System.Net.HttpWebRequest.EndGetResponse (System.IAsyncResult asyncResult) [0x00019] in /Library/Frameworks/Xamarin.iOS.framework/Versions/Current/src/Xamarin.iOS/mcs/class/System/System.Net/HttpWebRequest.cs:1200 
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 <a6e593f3cb7d44ddb2035eb114e94ff7>:0 
--- End of stack trace from previous location where exception was thrown --- 
at System.Net.Http.MonoWebRequestHandler.SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) [0x003d1] in /Library/Frameworks/Xamarin.iOS.framework/Versions/Current/src/Xamarin.iOS/mcs/class/System.Net.Http/MonoWebRequestHandler.cs:495 

Пожалуйста, найдите код запроса API ниже,

private async Task<MyObject> Sample(string requestUri)
{
    var client = new HttpClient
    {
        Timeout = TimeSpan.FromSeconds(60)
    };

    var response = await client.GetStringAsync(requestUri);

    var settings = new JsonSerializerSettings
    {
        NullValueHandling = NullValueHandling.Ignore,
        MissingMemberHandling = MissingMemberHandling.Ignore
    };

    return JsonConvert.DeserializeObject<MyObject>(response, settings);
}

Примечание. В Android все работает нормально.

Ответы [ 2 ]

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

Во-первых, вы неправильно используете HttpClient. Это приведет к множественным запросам, что может привести к ошибкам, которые могут взломать sh ваше приложение. Далее вы должны проверить в iOS опциях проекта, какую реализацию http-клиента вы используете. Если вы делаете вызовы https, убедитесь, что версия tls правильно обрабатывается реализацией клиента http. Имейте в виду, что управляемая реализация по умолчанию может обрабатывать только tls 1.0.

Ссылки:

Документация MS HttpClient

Статья ASP. NET Монстры

Документация MS iOS HttpClient

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

Использовать пробный улов:

private async Task<MyObject> Sample(string requestUri)
{
    try{
        var client = new HttpClient
        {
            Timeout = TimeSpan.FromSeconds(60)
        };

        var response = await client.GetStringAsync(requestUri);

        var settings = new JsonSerializerSettings
        {
            NullValueHandling = NullValueHandling.Ignore,
            MissingMemberHandling = MissingMemberHandling.Ignore
        };

        return JsonConvert.DeserializeObject<MyObject>(response, settings);
    }
    catch(HttpRequestExceptions ex){

        return default;
    }
}
...