C# 使用Xamarin表单的HttpClient

C# 使用Xamarin表单的HttpClient,c#,xamarin.forms,httpclient,asp.net-core-webapi,C#,Xamarin.forms,Httpclient,Asp.net Core Webapi,我正在处理Xamarin forms应用程序,不确定这是由C#/HttpClient还是Xamarin forms触发的错误 在我的Xamarin Forms应用程序中,我有一个RequestService类,其中包含以下代码: public class RequestService : IRequestService { private static HttpClient instance; private static HttpClient HttpClientInstanc

我正在处理Xamarin forms应用程序,不确定这是由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);
        }
    }
}
在这条线上,它尝试做一些事情,然后退出应用程序。该行的调试控制台显示以下内容:

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)
线程已启动:#3
05-14 10:20:51.974 D/Mono(20217):组件参考addref ModernHttpClient[0x7028fef180]->系统[0x701365c000]:15
05-14 10:20:51.986 D/Mono(20217):组件参考addref MODERNHTTP客户端[0x7028fef180]->系统核心[0x701439c500]:10
05-14 10:20:52.098 D/Mono(20217):DllImport在以下位置搜索:“_Internal”(“(null)”)。
05-14 10:20:52.098 D/Mono(20217):搜索“java_interop_jnienv_new_object_array”。
05-14 10:20:52.098 D/Mono(20217):探测“java_interop_jnienv_new_object_array”。
05-14 10:20:52.098 D/Mono(20217):被发现为“java_interop_jnienv_new_object_array”。
05-14 10:20:52.101 D/Mono(20217):DllImport在以下位置搜索:''uuu Internal'('(null)'。
05-14 10:20:52.101 D/Mono(20217):搜索“java_interop_jnienv_set_object_array_element”。
05-14 10:20:52.101 D/Mono(20217):探测“java_interop_jnienv_set_object_array_element”。
05-14 10:20:52.101 D/Mono(20217):被发现为“java_interop_jnienv_set_object_array_element”。
05-14 10:20:52.107 D/Mono(20217):DllImport在以下位置搜索:“_Internal”(“(null)”)。
05-14 10:20:52.107 D/Mono(20217):搜索“java\u interop\u jnienv\u get\u object\u array\u element”。
05-14 10:20:52.107 D/Mono(20217):探测“java_interop_jnienv_get_object_array_element”。
05-14 10:20:52.107 D/Mono(20217):被发现为“java_interop_jnienv_get_object_array_element”。
05-14 10:20:52.213 D/Mono(20217):DllImport在以下位置搜索:''uuu Internal'('(null)')。
05-14 10:20:52.214 D/Mono(20217):搜索“java互操作调用布尔方法”。
05-14 10:20:52.214 D/Mono(20217):探索“java互操作调用布尔方法”。
05-14 10:20:52.214 D/Mono(20217):被发现为“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)程序集:mscorlib.dll类型:BadImageFormatException成员:
05-14 10:20:52.354 F/libc(20217):致命信号6(SIGABRT),tid 20217中的代码-6(com.companyname.appname),pid 20217(com.companyname.appname)
这里需要注意以下几点:

  • 我正在使用ModernHttpClient
  • Android项目->属性->Android选项->下的设置为:
    • HttpClient实现=Android
    • SSL/TLD实现=本机TFS 1.2+
  • 有人遇到过这个问题吗?如蒙协助,将不胜感激


    谢谢

    好的!因此,通过执行以下操作解决了此问题:

    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)
    
  • 升级至Xamarin表单的最新版本
  • 摆脱ModernHttpClient,因为第3点不再需要它
  • ModernHttpClient(即本机SSL/Tls)的功能现在内置到Xamarin中,现在可以在平台级别按照以下链接进行配置:
  • iOS-


    Android-

    我将首先从请求中删除ConfigureWait。等待同步任务没有意义。然后,我发现最好的方法是在方法周围添加一个try-catch,并从那里调试异常。至少它可以帮助您更好地了解问题。
    BadImageFormatException
    动态链接库(DLL)或可执行程序的文件映像无效时引发的异常。你有什么更新吗?@wiskycoder这是怎么同步的?您只能等待异步任务,并且只能配置等待的任务。删除它将导致在捕获的上下文上继续,但不会造成明显的差异。感谢您的输入。我已经删除了configurewait,并尝试围绕该行包装一个try…catch。调试器到达该行,然后退出调试。它不能到达异常部分。我已经在另一个简单的解决方案中重述了这个错误。@TheGeneral:我花了一些时间才找到答案,但“是”将XF更新为最新的稳定版本,将Modernhttpclient更新为v2.7.0,该版本与XF v3+几乎同时发布。顺便提一下BadImageException行转换为什么?