【问题标题】:HttpClient is extremely very slow - Xamarin FormsHttpClient 非常慢 - 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() 方法,从顶部方法(事件处理程序)向下发布整个链。

标签: c# xamarin.forms httpclient


【解决方案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 有一些问题.. 或者可能是网络问题

【讨论】:

  • 您是否在项目属性中设置了任何权限?
  • 您设备的开发者选项中有哪些网络设置?
猜你喜欢
  • 2018-06-22
  • 2020-04-13
  • 1970-01-01
  • 2017-11-24
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
  • 1970-01-01
  • 2020-12-21
相关资源
最近更新 更多