如何在IIS中增加异步方法的最大并发请求数?

时间:2018-05-02 13:21:52

标签: c# web-services iis async-await

我在IIS上的应用程序中运行的MVC控制器上有以下异步方法:

public async Task<ActionResult> GetStatus(Record record)
{
    string key = $"status:{record.Key}";
    Record cached = MemoryCache.Default.Get(key) as Record;

    if (cached == null)
    {
        using (var client = new MyWebService.MyWebServiceClient())
        {
            var info = await client.GetStuffAsync(record.Foo);
            record.Bar = info.Bar;
        }

        MemoryCache.Default.Set(key, record, new CacheItemPolicy { AbsoluteExpiration = DateTimeOffset.Now.AddMinutes(15) });
    }
    else
    {
        record = cached;
    }

    return this.Json(record, JsonRequestBehavior.AllowGet);
}

该方法是通过客户端浏览器的AJAX调用的。浏览器会一次发送多个(~100个)请求,并在回复时处理每个响应。

我注意到它似乎将同时请求的数量限制在五个左右。然而,我感到困惑的是,瓶颈似乎是IIS响应请求而不是Web服务。

例如,如果我执行以下操作:

  • 在一个新的实例上(MemoryCache中没有任何内容),发送一堆请求,让我们说出关键字&#34; A1&#34;,&#34; A2&#34;, ......,&#34; A100&#34;。每个请求加载大约需要五秒钟,这可能是client.GetStuffAsync需要的时间。这些要求似乎一次又一批地返回。
  • 加载完全相同的页面,以便进行相同的请求(&#34; A1&#34;,&#34; A2&#34;,...,&#34; A100&#34;)。数据几乎瞬间加载,因为所有结果都被缓存。这是预期的。
  • 打开另一页并发送不同批次的请求,例如&#34; B1&#34;,&#34; B2&#34;,...,&#34; B100&#34;。这开始以类似的方式加载到第一个请求。
  • 在此过程中,加载初始页面(&#34; A1&#34;,&#34; A2&#34;,...,&#34; A100&#34;)。该页面基本上冻结,等待其他请求(&#34; B1&#34;,&#34; B2&#34;,...,&#34; B100&#34;)全部完成。然后页面立即加载。

最后一个场景让我感到难过。我原以为Web服务上的await将允许IIS在此期间切换到其他请求。我可以将长时间运行的Web服务作为瓶颈,但是现在它看起来像IIS排队等待其他请求,即使它正在等待Web服务。

0 个答案:

没有答案
相关问题