我在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
需要的时间。这些要求似乎一次又一批地返回。最后一个场景让我感到难过。我原以为Web服务上的await
将允许IIS在此期间切换到其他请求。我可以将长时间运行的Web服务作为瓶颈,但是现在它看起来像IIS排队等待其他请求,即使它正在等待Web服务。