【问题标题】:IIS WP requests stays foreverIIS WP 请求永远存在
【发布时间】:2014-11-01 17:58:41
【问题描述】:

我在我的虚拟机中托管了一个 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 是一个好习惯吗?

【问题讨论】:

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


    【解决方案1】:

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

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

    您应该看到向您的博客发出的请求需要很长时间

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

    或者,您只是请求所有不同的 URL,这会导致缓存不起作用。

    使用 await 是否是一个好主意的问题实际上归结为另一个问题:When should we use async IO? 我将总结我现有的详细回复:将它用于需要很长时间的操作并且经常被调用。 See also this.

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

    【讨论】:

    • 使用搜索引擎了解如何配置 Fiddler。这很容易。搜索词将是“Fiddler IIS”;我不熟悉 WebAPI 或 CacheCow。也许缓存有效,但您请求的 URL 大多不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 2023-03-12
    相关资源
    最近更新 更多