HttpClient 非常慢 - Xamarin Forms

Posted

技术标签:

【中文标题】HttpClient 非常慢 - Xamarin Forms【英文标题】:HttpClient is extremely very slow - Xamarin Forms 【发布时间】:2018-05-27 03:00:33 【问题描述】:

我正在尝试从 url 下载一些 json。 我正在通过我的三星设备调试应用程序,但由于某种原因,httpclient 需要很长时间才能下载数据。

当我使用 TimeSpan.FromMinutes(30) 设置超时时,httpclient 需要很长时间,这是不切实际的。但是,当我删除超时时,我得到了 try catch 块捕获的 TaskCancelled 异常。

以前有人见过这种行为吗?

尝试检查权限:应用程序需要的唯一权限是互联网,默认情况下在调试模式下授予。

任何帮助将不胜感激。谢谢!


编辑

这是负责下载数据的类:

 public static class DataSource
    
        public async static void LoadFrom()
        
               var uri = new Uri("https://api.coinmarketcap.com/v2/ticker/?convert=usd&sort=price");    
            try
            
                bool isConnected = CrossConnectivity.Current.IsConnected;
                HttpClient myClient = new HttpClient(new Xamarin.android.Net.AndroidClientHandler());
                var response = await myClient.GetAsync(uri);
                if (response.IsSuccessStatusCode)
                
                    var Data = await response.Content.ReadAsStringAsync();
                    var CoinMarketCapObject = JsonConvert.DeserializeObject<CoinMarketCap.CoinMarketCapCurrencyData>(Data);
                    List<Currency> currencies = new List<Currency>();
                    if (CoinMarketCapObject != null)
                    
                        foreach (var Datum in CoinMarketCapObject.Data)
                        
                            currencies.Add(new Currency(Datum.Value.name, Datum.Value.symbol, Datum.Value.quotes.USD.price));
                        
                    
                
            
            catch (TimeoutException ex)
            
                // Check ex.CancellationToken.IsCancellationRequested here.
                // If false, it's pretty safe to assume it was a timeout.
            
            catch (TaskCanceledException ex)
            
                // Check ex.CancellationToken.IsCancellationRequested here.
                // If false, it's pretty safe to assume it was a timeout.
            
            catch (Exception e)
            
                Debug.Print(e.Message);

            
        

    

我正在从 OnStart 方法调用 LoadFrom 方法。

protected override void OnStart ()
        
            // Handle when your app starts
            API.DataSource.LoadFrom();
        

【问题讨论】:

该方法是如何以及在哪里调用的? 数据真的返回了吗?你确定你没有陷入僵局吗? @Nkosi 我添加了一些信息... 如果您使用网络浏览器下载数据,下载需要多长时间? 答案可能在于您如何调用此 Load() 方法,从顶部方法(事件处理程序)向下发布整个链。 【参考方案1】:

我怀疑您使用的是HttpClientHandler。 Xamarin 当前的建议是使用 AndroidNativeHandler。这使用原生 Android 网络堆栈并具有加密支持,而不是在 .NET 运行时中进行虚拟化。但是,权衡是仅从 Android 5 开始支持,并且某些 HttpClient 功能/选项不可用。

https://docs.microsoft.com/en-us/xamarin/android/app-fundamentals/http-stack

【讨论】:

我按照链接中的建议进行了更改,但没有任何反应。【参考方案2】:

在华为 P9 Lite 上测试 ==> 几秒钟即可获得结果...

public async void LoadFrom()

    var uri = new Uri("https://api.coinmarketcap.com/v2/ticker/?convert=usd&sort=price");
    try
    
        HttpClient myClient = new HttpClient();
        var response = await myClient.GetStringAsync(uri);
        Console.WriteLine(response);
    
    catch (TimeoutException ex)
    
        // Check ex.CancellationToken.IsCancellationRequested here.
        // If false, it's pretty safe to assume it was a timeout.
    
    catch (TaskCanceledException ex)
    
        // Check ex.CancellationToken.IsCancellationRequested here.
        // If false, it's pretty safe to assume it was a timeout.
    
    catch (Exception e)
    

    

也许您的 myclient 有一些问题.. 或者可能是网络问题

【讨论】:

您是否在项目属性中设置了任何权限? 您设备的开发者选项中有哪些网络设置?

以上是关于HttpClient 非常慢 - Xamarin Forms的主要内容,如果未能解决你的问题,请参考以下文章

使用 Xamarin 表单的 HttpClient

Xamarin 表单 HttpClient 卡住

C# Xamarin 没有收到来自 HttpClient 的响应

HttpClient 不可用共享库项目 Xamarin

Xamarin 中的 WebException,使用 HttpClient

Xamarin - 在 .Net 标准库中使用 httpClient