Запросы начинают сбой в Xamarin с помощью Refit - PullRequest
0 голосов
/ 30 января 2020

После выполнения большого количества сетевых запросов за короткий промежуток времени мы продолжаем получать ошибку «Задача была отменена» из наших ответов, как только мы начинаем получать эти ошибки, любые запросы, сделанные после того, как ошибки прекратились, возвращают те же ошибки, пока мы перезапускаем приложение. Мы используем AuthenticatedHttpClientHandler для обработки токенов аутентификации в наших запросах:

public class AuthenticatedHttpClientHandler : HttpClientHandler
{
    private readonly IReauthService _reauthService;

    public AuthenticatedHttpClientHandler(IReauthService reauthService)
    {
        _reauthService = reauthService;
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        Debug.WriteLine("Url: " + request.RequestUri);

        var auth = request.Headers.Authorization;

        if (auth != null)
        {
            string token = await _reauthService.GetToken();

            request.Headers.Authorization = new AuthenticationHeaderValue(auth.Scheme, token);
        }

        try
        {
            //Error occurs on this line
            HttpResponseMessage resp = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);

            return resp;
        }
        catch (Exception e)
        {
            //this.GetLogger().LogToDebugConsole("FAILED: " + request.Method + " " + request.RequestUri);
            //this.GetLogger().LogToDebugConsole("Reason: " + e.Message);
            //this.GetLogger().LogToDebugConsole("Stacktrace: " + e.StackTrace);

            Crashes.TrackError(e);

            throw new RequestFailedException(e);
        }
    }
}

Мы используем это так:

container.RegisterSingleton(() =>
        {
            var handler = container.Resolve<AuthenticatedHttpClientHandler>();

            HttpClient client = new HttpClient(handler)
            {
                BaseAddress = new Uri(UrlConfig.MobileApiBaseUrl + UrlConfig.Version),
                Timeout = TimeSpan.FromSeconds(30)
            };

            var service = RestService.For<IMobileApiClient>(client);
            return service;
        });

Тайм-аут 30 с не является проблемой, так как все наши запросы до 2 с, и мы можем последовательно воспроизвести ошибки.

Для каждого вызова используется один экземпляр HttpClient. Мы также используем MvvmCross, и проблема, кажется, только на iOS. Мы попытались изменить HttpClientImplementation в настройках нашего проекта, а также использовать новый экземпляр HttpClient при каждом вызове, но ни один из них не сработал.

Full Stacktrace:

==========A task was canceled.==========
==========  at System.Net.Http.MonoWebRequestHandler.SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) [0x004ac] in /Library/Frameworks/Xamarin.iOS.framework/Versions/Current/src/Xamarin.iOS/mcs/class/System.Net.Http/MonoWebRequestHandler.cs:507 
at CustomerApp.Core.Networking.LoggingAuthenticatedHttpClientHandler.SendAsync (System.Net.Http.HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) [0x0059f] in /Users/user/VSProjects/CustomerApp/CustomerApp.Core/Networking/AuthenticatedHttpClientHandler.cs:38 ==========

Настройки сборки:

enter image description here

...