IIS WP请求永远保留

时间:2014-11-01 17:58:42

标签: c# iis asp.net-web-api async-await

我在我的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看到很少有请求停留很长时间。

enter image description here

可能是什么原因? 其次,我看到该应用每分钟提供约300个请求。在上面的代码中使用async-await是一个好习惯吗?

1 个答案:

答案 0 :(得分:0)

您的代码是正确的。正在使用最佳做法。

这里没有任何迹象表明过度延误。显然,后端URL响应缓慢。您可以通过使用Fiddler来观察传入和传出的HTTP请求来测试此理论。确保在web.config文件中配置Fiddler代理,以防您使用IIS进行调试。

您应该会看到对您博客的传出请求需要很长时间

IIS窗口显示执行请求处理程序(这是您的代码)的所有请求都被卡住了。显然,您应用的缓存属性由于某种原因没有采用。我不熟悉那个属性。是不是有内置的标准属性可以使用?

或者,您只是要求所有不同的URL导致缓存无法发挥作用。

使用等待是否是一个好主意的问题实际上归结为一个不同的问题: When should we use async IO? 我将总结我现有的详细回复:将其用于以下操作:需要很长时间才能被频繁调用。 See also this.

这种情况是异步IO 的一个非常好的用例。 await是实现异步IO的最现代方式。