HttpClient с использованием форм Xamarin - PullRequest
0 голосов
/ 14 мая 2018

Я работаю над приложением форм Xamarin и не уверен, что это ошибка, вызванная C # / HttpClient или Xamarin Forms.

В моем приложении Xamarin Forms у меня есть класс RequestService, который содержит следующий код:

public class RequestService : IRequestService
{
    private static HttpClient instance;
    private static HttpClient HttpClientInstance => instance ?? (instance = new HttpClient(new NativeMessageHandler() { EnableUntrustedCertificates = true, DisableCaching = true }));
    public async Task<TResult> GetAsync<TResult>(string uri, string token = "")
    {
        setupHttpClient(token);
        HttpResponseMessage response = await HttpClientInstance.GetAsync(uri).ConfigureAwait(false);
        await HandleResponse(response);
        string responseData = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
        return await Task.Run(() => JsonConvert.DeserializeObject<TResult>(responseData));
    }

    private void setupHttpClient(string token = "")
    {
        HttpClientInstance.DefaultRequestHeaders.Accept.Clear();
        HttpClientInstance.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

        if (!string.IsNullOrWhiteSpace(token))
        {
            HttpClientInstance.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", token);
        }
    }

    private async Task HandleResponse(HttpResponseMessage response)
    {
        if (!response.IsSuccessStatusCode)
        {
            var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
            if (response.StatusCode == HttpStatusCode.Forbidden || response.StatusCode == HttpStatusCode.Unauthorized)
            {
                throw new Exception(content);
            }
            throw new HttpRequestException(content);
        }
    }
}

Последние 5-7 дней он работал достаточно хорошо, но сегодня он начал падать без каких-либо ошибок. Любой запрос просто выходит из приложения.

Мне удалось отладить и отследить успешное выполнение до строки:

    HttpResponseMessage response = await HttpClientInstance.GetAsync(uri).ConfigureAwait(false);

Именно в этой строке он пытается что-то сделать, а затем просто выходит из приложения. Консоль отладки для этой строки показывает следующее:

Thread started:  #3
05-14 10:20:51.974 D/Mono    (20217): Assembly Ref addref ModernHttpClient[0x7028fef180] -> System[0x701365c000]: 15
05-14 10:20:51.986 D/Mono    (20217): Assembly Ref addref ModernHttpClient[0x7028fef180] -> System.Core[0x701439c500]: 10
05-14 10:20:52.098 D/Mono    (20217): DllImport searching in: '__Internal' ('(null)').
05-14 10:20:52.098 D/Mono    (20217): Searching for 'java_interop_jnienv_new_object_array'.
05-14 10:20:52.098 D/Mono    (20217): Probing 'java_interop_jnienv_new_object_array'.
05-14 10:20:52.098 D/Mono    (20217): Found as 'java_interop_jnienv_new_object_array'.
05-14 10:20:52.101 D/Mono    (20217): DllImport searching in: '__Internal' ('(null)').
05-14 10:20:52.101 D/Mono    (20217): Searching for 'java_interop_jnienv_set_object_array_element'.
05-14 10:20:52.101 D/Mono    (20217): Probing 'java_interop_jnienv_set_object_array_element'.
05-14 10:20:52.101 D/Mono    (20217): Found as 'java_interop_jnienv_set_object_array_element'.
05-14 10:20:52.107 D/Mono    (20217): DllImport searching in: '__Internal' ('(null)').
05-14 10:20:52.107 D/Mono    (20217): Searching for 'java_interop_jnienv_get_object_array_element'.
05-14 10:20:52.107 D/Mono    (20217): Probing 'java_interop_jnienv_get_object_array_element'.
05-14 10:20:52.107 D/Mono    (20217): Found as 'java_interop_jnienv_get_object_array_element'.
05-14 10:20:52.213 D/Mono    (20217): DllImport searching in: '__Internal' ('(null)').
05-14 10:20:52.214 D/Mono    (20217): Searching for 'java_interop_jnienv_call_boolean_method'.
05-14 10:20:52.214 D/Mono    (20217): Probing 'java_interop_jnienv_call_boolean_method'.
05-14 10:20:52.214 D/Mono    (20217): Found as 'java_interop_jnienv_call_boolean_method'.
05-14 10:20:52.348 F/        (20217): /Users/builder/jenkins/workspace/xamarin-android-d15-6/xamarin-android/external/mono/mono/mini/debugger-agent.c:4846: (null) assembly:mscorlib.dll type:BadImageFormatException member:<none>
05-14 10:20:52.354 F/libc    (20217): Fatal signal 6 (SIGABRT), code -6 in tid 20217 (com.companyname.appname), pid 20217 (com.companyname.appname)

Здесь следует отметить несколько вещей:

  1. Я использую ModernHttpClient
  2. Настройки в Android Project -> Свойства -> Параметры Android ->:
    • Реализация HttpClient = Android
    • Реализация SSL / TLD = собственный TFS 1.2 +

Кто-нибудь сталкивался с этой проблемой? Любая помощь будет принята с благодарностью.

Спасибо

1 Ответ

0 голосов
/ 01 июля 2018

Хорошо!Таким образом, это было решено следующим образом:

  1. Обновление до последней версии форм Xamarin.
  2. Избавьтесь от ModernHttpClient, так как он больше не требуется из-за пункта 3.
  3. Функциональность ModernHttpClient (то есть Native SSL / Tls) теперь встроена в Xamarin и теперь может быть настроена на уровне платформы согласно ссылкам ниже:

iOS - https://docs.microsoft.com/en-us/xamarin/cross-platform/macios/http-stack

Android - https://docs.microsoft.com/en-us/xamarin/android/app-fundamentals/http-stack?tabs=windows

...