ASP.NET Web API 2处理异步请求

时间:2016-06-21 14:11:33

标签: c# asp.net asynchronous asp.net-web-api

我正在尝试确定当两个客户端同时调用我的Web API方法时会发生什么。为此,我在Python中生成了两个异步请求:

rs = (grequests.post(url, data = json), grequests.post(url, data = json))
grequests.map(rs)

请求在我的WebApi中调用非异步方法,该方法正在更改我的资源,这是一个静态类实例。根据我的理解,API请求不应同时运行,这是我想要的是因为我不希望这两个请求相互干扰。但是,如果我在API方法中设置了一个断点,那么这两个请求似乎同时运行(并行)。这会导致一些不必要的结果,因为这两个请求正在以平行方式更改相同的资源。

有没有办法确保Web API不同时处理请求?

1 个答案:

答案 0 :(得分:3)

对您的Web API方法的请求由IIS应用程序池(线程池)处理,该应用程序池为其接收的每个同步请求初始化一个线程。没有办法告诉IIS非并发地运行这些线程。

我相信你对什么是非同步"有误解? Web API方法是。当Web API方法是异步时,意味着它将在等待状态下共享其应用程序池线程。这具有其他请求不必初始化新线程的优点(这有点昂贵)。它还有助于最小化并发线程数,从而最大限度地减少应用程序池必须排队的线程数。

对于非异步方法,即使非活动线程可用,IIS应用程序池也会为每个请求初始化一个新线程。此外,它不会与任何其他请求共享该线程。

所以对你的问题的简短回答是否定的。无法确保非API同时处理Web API请求。 Brian Driscoll的评论是正确的。您必须在请求期间锁定共享资源。