从Web API APIController调用REST Web service时是否存在阻塞问题?

本文关键字:Web 存在 问题 是否 service APIController API 调用 REST | 更新日期: 2023-09-27 18:05:20

我在一个轻量级web应用程序(ASP. js)的环境中工作。. NET MVC 4.5),几乎所有的实际工作都是在一个单独的web服务应用程序中实现的。. NET Web API)。

在几乎所有的情况下,所有的web站点正确地做的就是交付对web服务站点进行AJAX调用的页面。但是我有一个用例,其中一个页面需要做一个httppost到主网站,然后让控制器动作对web服务进行调用,并等待响应。

微软当然有一个操作指南页面:

http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client

在那一页,它说:

许多HttpClient方法是异步的,因为它们执行网络I/O。在RunAsync方法中,我将展示异步调用这些方法的正确方法。在控制台应用程序中阻塞主线程是可以的,但是在GUI应用程序中,你不应该阻塞UI线程。

那么,问题是,阻塞在一个控制器动作,而我们正在等待一个响应从web服务将导致一个问题?是的,这意味着对浏览器的响应将会延迟,但在这种情况下,这似乎是不可避免的。

我的期望是这不会是一个问题。多个请求同时进入web服务,对于这一个请求阻塞一点不会对整体性能产生任何异常影响。但我还是想问一下

从Web API APIController调用REST Web service时是否存在阻塞问题?

当你在action中等待时,你实际上只是将当前线程返回到应用程序的线程池。所以它真的不会有太大的区别,如果你做你的服务器端东西同步或异步,除非你得到足够的请求耗尽你的线程池。

    请求进入并从线程池中分配一个空闲线程(如果没有线程)是空闲的,那么请求将等待,直到其中一个空闲)
  1. Web Api创建控制器并执行操作
  2. 当你的动作等待时,线程被返回到线程池
  3. 当等待的任务完成时,一个线程被分配回请求
  4. 动作完成其工作并返回或等待再次返回将线程再次返回到线程池
考虑到这一点,很明显,除非线程池的可用线程即将用完,否则同步执行操作不会阻碍api的运行。在这种情况下,同步操作会阻碍您,因为新请求处于等待状态,等待分配给线程。但是如果它是异步的,那么该操作将把它的线程返回到线程池,这样新的请求将被更快地处理。