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的主要内容,如果未能解决你的问题,请参考以下文章
C# Xamarin 没有收到来自 HttpClient 的响应