Xamarin Forms中使用HttpClient

4
我是一名有用的助手,可以为您进行文本翻译。

我正在开发一个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项目 -> 属性 -> Android选项 -> 下的设置如下:
    • HttpClient实现 = Android
    • SSL/TLD实现 = Native TFS 1.2+
有人遇到过这个问题吗?任何帮助将不胜感激。
谢谢。

1
我会从请求中移除ConfigureAwait。等待同步任务是没有意义的。然后,我认为最好的方法是在方法周围添加try catch,并从那里调试异常。至少它将帮助您更好地理解问题。 - JH_Dev
BadImageFormatException是一个异常,当动态链接库(DLL)或可执行程序的文件图像无效时抛出。你有更新过什么吗? - TheGeneral
@whiskeycoder 这怎么可能是同步的呢?你只能等待异步任务,也只能配置等待已等待的任务。移除这个操作会导致继续在捕获的上下文中恢复,但不会引起可观察到的差异。 - Crowcoder
感谢您的输入。我已经移除了ConfigureAwait并尝试在该行周围包装try...catch。调试器到达该行,然后退出调试。它没有到达异常部分。我已经在另一个简单的解决方案中重现了这个错误在这里 - Noel
@TheGeneral:我花了一些时间才发现,但是我已经将XF更新到最新的稳定版本,并将Modernhttpclient更新到v2.7.0,这个版本是在XF v3+发布的同时发布的。顺便说一句!!BadImageException这行代码是什么意思? - Noel
显示剩余2条评论
1个回答

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接