为什么HttpClient的GetStringAsync方法如此缓慢?

13

我有一个Windows Phone 8项目,我使用了PCL(可移植类库)项目,因为我还要构建一个Win8应用程序。

然而,在调用我的Azure API时,我的HttpClient的GetStringAsync非常慢。我加入了一些带有日期时间的调试代码,发现GetStringAsync需要大约14秒!有时甚至需要更长时间。

我要做的是从我的Azure API站点检索简单的JSON数据。我的Android客户端在几秒钟内就可以获取相同的数据...那么我错过了什么吗?

设置非常简单:

HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
client.DefaultRequestHeaders.Add("X-Token", "something");
string responseJSON = await client.GetStringAsync("url");

我已经在await的前后放置了调试时间,中间相差14秒!

有人知道原因吗?


1
你的调用栈中有其他异步方法吗?你总是在等待它们吗?有时候,慢速应用程序意味着你正在使用.Result而不是await。例如 string responseJSON = client.GetStringAsync("url").Result; - chue x
你的 Uri 返回的字符串有多大?如果速度存在很大差异,你尝试在 WP8 上使用 WebClient 吗?如果在 Web 浏览器中简单地使用,响应速度怎么样? - Martin Suchan
@chue 我在等它们全部完成,但目前我只在运行其中一个。尝试使用了,结果需要很长时间! - Jason94
@Martin Suchan 这个字符串有2.99 KB大小。我有一个简单的WP8项目,使用WebClient可以正常工作!为什么在使用HttpClient的PCL中不能正常工作呢? - Jason94
2
你在3年前问了这个问题,但我今天遇到了完全相同的问题。你找到解决方案了吗? - soapergem
显示剩余2条评论
2个回答

13

我遇到了同样的问题,并找到了这个问题。对我来说,问题在于HttpClient试图使用代理,但对大多数人来说代理不存在。这就是使它变慢的原因。将初始化更改为以下方式,您将会注意到显着的加速。

HttpClientHandler hch = new HttpClientHandler();
hch.Proxy = null;
hch.UseProxy = false;

HttpClient client = new HttpClient(hch);

0

将GetStringAsync替换为GetString,以确保实际上是异步\等待引起了您的问题,而不是堆栈中的其他任何内容。


3
如果我没记错的话,HttpClient中没有GeString方法。 - Jakub Holovsky
你是正确的。我对WebClient感到困惑:https://msdn.microsoft.com/en-us/library/fhd1f0sw(v=vs.110).aspx 它有一个同步和一个异步的等效物。这将有助于消除httpclient作为潜在问题的可能性。 - Mike Barry

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