Android上的HttpClient不起作用

4
我正在制作一个Xamarin.Forms应用程序,该应用程序应该从API获取JSON,然后允许显示它。我的代码如下:
    public async void jsonDownload()
    {
        connect();
        await downloadData();


    }
    public void connect()
    {
        client = new HttpClient();
        client.MaxResponseContentBufferSize = 256000;
    }
    public async Task<List<Jsonclass>> downloadData()
    {

        String url = "https://my-json-server.typicode.com/kgbzoma/TestJsonFile/all";
        var uri = new Uri(string.Format(url, string.Empty));
        try
        {

            var response = await client.GetAsync(uri).ConfigureAwait(false);
            response.EnsureSuccessStatusCode(); //NEVER GET HERE

            var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false); 
            List = JsonConvert.DeserializeObject<List<Jsonclass>>(content);

        }catch (Exception ex)
        {
            Debug.WriteLine(@"     Error {0}", ex.Message);
        }
        return List;
    }

问题在于代码甚至没有到达response.EnsureSuccessStatusCode(); 所以我的对象列表是空的。 在UWP版本中,它可以正常工作而没有任何问题。 这里我会得到异常:System.Net.Http.HttpRequestException,消息为发送请求时发生错误。

1个回答

5

SecureChannelFailure (身份验证或解密失败.)

或者

System.Net.WebException: 错误:TrustFailure

或者

Mono.Security.Protocol.Tls.TlsException: 从服务器接收到的证书无效。

默认情况下,Xamarin.Android使用旧版的Mono Managed HttpClient处理程序,不支持TLS 1.2。

打开您的Xamarin.Android项目设置,转到Build / Android Build / General并使用AndroidClientHandler

enter image description here

这将直接添加以下MSBuild属性到您的.csproj文件中。

<AndroidHttpClientHandlerType>Xamarin.Android.Net.AndroidClientHandler</AndroidHttpClientHandlerType>
<AndroidTlsProvider>btls</AndroidTlsProvider>

注意:如果手动在.csproj文件中进行此操作,则需要将其添加到debug和release PropertyGroup中。
或者通过编程方式设置HttpClient来使用它:
client = new HttpClient(new AndroidClientHandler());

注意:处理这类错误时,您应查看InnerException

catch (Exception ex)
{
    Console.WriteLine(@"     Error {0}", ex.Message);
    Console.WriteLine(@"     Error {0}", ex.InnerException?.Message);
}

你能告诉我在Visual Studio中哪里可以找到这个选项吗?我无法通过编程设置它,因为它在UWP上不起作用。 - ChrisB
@ChrisB Xamarin.Android项目设置,转到Build/Android Build/General并使用AndroidClientHandler。 - SushiHangover
1
对我来说,仅更改第二个参数(TLS1.2)就可以解决问题,更改httpclient实现也会导致问题。 - Josh Mc

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