2016-06-21 235 views
0

我想确定当我的Web API方法被两个客户端同时调用时会发生什么。为了做到这一点,我在Python中生成两个异步请求:ASP.NET Web API 2处理异步请求

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

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

有什么方法可以确保Web API非并发地处理请求吗?

+1

锁定您的共享资源。 –

+0

@BrianDriscoll请参阅我的编辑。我已经确定资源被锁定在一个队列中,但是,我仍然在请求之间发生干扰。 –

+3

Web API请求是否同时运行取决于您的API托管方式,因此不会在代码中确定。如果您在IIS中运行,则您的请求将由单独的工作进程并发处理。不知道更多关于API的信息,我会认为你有设计问题而不是实现问题。 –

回答

3

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

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

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

所以你的问题的简短答案是否定的。没有办法确保Web API请求不是同时处理的。 Brian Driscoll的评论是正确的。你将不得不在请求期间锁定你的共享资源。