我在我的VM中托管了一个WebAPI(使用最新版本)(具有.net框架4.5.2,带有所有更新的Windows Server 2012 R2)。
WebAPI代码从我的博客(外部公共URL)返回RSS提要。
这是相同的代码。
我使用this来缓存WebAPI输出。
[AllowAnonymous]
[CacheOutput(ServerTimeSpan = 9000, ExcludeQueryStringFromCacheKey = false)]
[HttpGet]
public async Task<HttpResponseMessage> GetRecentPost(string type)
{
string responseFromServer;
WebRequest request = null;
request = WebRequest.Create("My_EXTERNAL_BLOG_URL_HERE");
using (var response = await request.GetResponseAsync())
{
using (var dataStream = response.GetResponseStream())
{
using (var reader = new StreamReader(dataStream))
{
responseFromServer = await reader.ReadToEndAsync();
}
}
}
return new HttpResponseMessage() { Content = new StringContent(responseFromServer, Encoding.UTF8, ContentType) };
}
我可以从IIS看到很少有请求停留很长时间。
可能是什么原因? 其次,我看到该应用每分钟提供约300个请求。在上面的代码中使用async-await是一个好习惯吗?
答案 0 :(得分:0)
您的代码是正确的。正在使用最佳做法。
这里没有任何迹象表明过度延误。显然,后端URL响应缓慢。您可以通过使用Fiddler来观察传入和传出的HTTP请求来测试此理论。确保在web.config文件中配置Fiddler代理,以防您使用IIS进行调试。
您应该会看到对您博客的传出请求需要很长时间。
IIS窗口显示执行请求处理程序(这是您的代码)的所有请求都被卡住了。显然,您应用的缓存属性由于某种原因没有采用。我不熟悉那个属性。是不是有内置的标准属性可以使用?
或者,您只是要求所有不同的URL导致缓存无法发挥作用。
使用等待是否是一个好主意的问题实际上归结为一个不同的问题: When should we use async IO? 我将总结我现有的详细回复:将其用于以下操作:需要很长时间才能被频繁调用。 See also this.
这种情况是异步IO 的一个非常好的用例。 await
是实现异步IO的最现代方式。