从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服务,对于这一个请求阻塞一点不会对整体性能产生任何异常影响。但我还是想问一下
当你在action中等待时,你实际上只是将当前线程返回到应用程序的线程池。所以它真的不会有太大的区别,如果你做你的服务器端东西同步或异步,除非你得到足够的请求耗尽你的线程池。
- 请求进入并从线程池中分配一个空闲线程(如果没有线程)是空闲的,那么请求将等待,直到其中一个空闲)
- Web Api创建控制器并执行操作
- 当你的动作等待时,线程被返回到线程池
- 当等待的任务完成时,一个线程被分配回请求
- 动作完成其工作并返回或等待再次返回将线程再次返回到线程池