为什么调用ASP.NET MVC Controller不执行DelegatingHandler?

Sha*_*tin 33 c# asp.net asp.net-mvc asp.net-web-api

介绍问题

我最近发现一个呼叫ApiController行动将触发DelegatingHandlerSendAsync方法,以及到香草的调用Controller操作将不会触发它.

搜索和研究

我已经研究过Web Api,并了解到它包含HttpMessageHandlerDelegatingHandler该类的父类.这使我相信HTTP消息处理程序通常只作为Web API管道的一部分执行.

此外,Http Message Handlers在Url Routing之前运行,因此它可能不是在Web API和MVC管道之间选择的URL路由.

...考虑使用动作过滤器而不是消息处理程序[因为a]过滤器在执行URI路由后运行.

  • HttpMessageHandlersASP.NET Web API的一部分而不是ASP.NET MVC的一部分吗?
  • HttpMessageHandlerMVC(图中的EQUIVALENT)中的等价物是什么?
  • 是什么导致请求遵循Web API管道(图中的FORK)?
  • Web API请求是否与MVC请求根本不同?

我的感觉就是这样,但请纠正我.

               Request from Client
                       |
                      IIS
                       |                           
                    ASP.NET
                       |
            HttpApplication.BeginRequest
                       |
                   et cetera
                       |
         HttpApplication.MapRequestHandler - is this what does the routing?
                       |
                     FORK                           
                   /       \
                  /         \
                 /           \
                /             \
               /               \
         **Web API**           **MVC**
              |                   |
 HttpControllerRouteHandler   MvcRouteHandler
              |                   |
    HttpControllerHandler         |    
              |                   |
    HttpMessageHandlers       EQUIVALENT?
            i.e.                  |
    DelegatingHandlers            |
            incl.                 |
    HttpServer                    |
    CustomHandlers                |
    HttpRoutingDispatcher         |
    HttpControllerDispatcher      |
Run Code Online (Sandbox Code Playgroud)

有用的网址

ASP.NET应用程序生命周期

ASP.NET Web API海报

ASP.NET MVC 5应用程序的生命周期

Yis*_*zer 30

为什么调用控制器不执行委托处理程序?

好吧,因为它们运行两个不同的执行路径,如果MVC路由匹配它然后执行MVCHandler,而委托处理程序仅在Api路由匹配时执行.简而言之,上图没有正确描述拆分.

委派处理程序在路由后和操作选择之前运行.路由和动作选择步骤经常混淆或交替使用,尽管它们是两个不同的步骤.

路由是将url与一组字符串段匹配以产生将RouteValues路由键映射到路由值的步骤.RouteValues然后用于行动选择.委托处理程序在这两个步骤之间运行.

在MVC中没有用于委派处理程序的等效方法,类似的方法是编写自己的处理程序,但是你在那里深入了解,尤其是链接生成.

另一种更简单的方法是编写全局过滤器,但请注意,只有在实际选择了某个操作时才会运行它.

逐行回答

HttpMessageHandlers是ASP.NET Web API的一部分,而不是ASP.NET MVC的一部分吗?

是的,它们只是WebAPI构造.

什么是MVC中的HttpMessageHandler等价物(图中的EQUIVALENT)?

没有确实存在,图表是错误的.最接近的是RouteHandler

是什么导致请求遵循Web API管道(图中的FORK)?

匹配WebAPI路由

Web API请求是否与MVC请求根本不同?

不,他们不是,分叉只在路由后发生.

编辑(2015年8月18日):在MVC Core中,Web API被合并到MVC中,并且有一个新的管道.