为什么对ASP.NET MVC控制器的调用不执行DelegatingHandler

本文关键字:调用 执行 DelegatingHandler 控制器 ASP NET MVC 为什么 | 更新日期: 2023-09-27 18:02:16

介绍问题

我最近了解到,对ApiController Action的调用将触发DelegatingHandlerSendAsync方法,而对普通Controller Action的调用不会触发它

搜索和研究

我研究了WebApi,了解到它包括HttpMessageHandler,它是DelegatingHandler类的父级。这让我相信,一般来说,HTTP消息处理程序只作为Web API管道的一部分执行。

此外,Http消息处理程序在Url路由之前运行,因此可能不是Url路由在Web API和MVC管道之间进行选择。

考虑使用操作筛选器而不是消息处理程序[因为]操作筛选器在执行URI路由之后运行。

问题

  • HttpMessageHandlers是ASP.NET Web API的一部分,而不是ASP.NET MVC的一部分吗
  • MVC中的HttpMessageHandler等价物是什么(图中的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      |

有用链接

ASP.NET应用程序生命周期

ASP.NET Web API海报

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

为什么对ASP.NET MVC控制器的调用不执行DelegatingHandler

为什么对控制器的调用不执行委派处理程序

因为它们运行两个不同的执行路径,如果MVC路由匹配,它就会执行MVCHandler,而委托处理程序只有在Api路由匹配时才会执行。简而言之,上图没有正确地描述拆分。

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

路由是将url与一组字符串段匹配以生成将路由关键字映射到路由值的RouteValues的步骤。CCD_ 10用于动作选择。委派处理程序在这两个步骤之间运行。

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核心中,Web API被合并到MVC中,并且有一个新的管道