Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么对ASP.NET MVC控制器的调用不执行DelegatingHandler?_C#_Asp.net_Asp.net Mvc_Asp.net Web Api - Fatal编程技术网

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

C# 为什么对ASP.NET MVC控制器的调用不执行DelegatingHandler?,c#,asp.net,asp.net-mvc,asp.net-web-api,C#,Asp.net,Asp.net Mvc,Asp.net Web Api,介绍问题 我最近了解到,对ApiController操作的调用将触发DelegatingHandler的SendAsync方法,而对普通控制器的调用不会触发它 搜索和研究 我研究了Web Api,了解到它包括HttpMessageHandler,它是DelegatingHandler类的父类。这使我相信HTTP消息处理程序通常只作为Web API管道的一部分执行 此外,在Web API和MVC管道之间进行选择的可能不是URL路由 考虑使用Acter过滤器代替消息处理程序[因为A] 执行URI路由

介绍问题

我最近了解到,对
ApiController
操作的调用将触发
DelegatingHandler
SendAsync
方法,而对普通
控制器的调用不会触发它

搜索和研究

我研究了Web Api,了解到它包括
HttpMessageHandler
,它是
DelegatingHandler
类的父类。这使我相信HTTP消息处理程序通常只作为Web API管道的一部分执行

此外,在Web API和MVC管道之间进行选择的可能不是URL路由

考虑使用Acter过滤器代替消息处理程序[因为A] 执行URI路由后运行

问题

  • HttpMessageHandlers
    是ASP.NET Web API的一部分,而不是ASP.NET MVC的一部分吗
  • MVC中的
    HttpMessageHandler
    等价物是什么(图中的等价物
  • 是什么导致请求遵循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      |
有用链接

为什么对控制器的调用不执行委派处理程序? 因为它们运行在两个不同的执行路径上,如果MVC路由匹配,那么它将执行MVCHandler,而委托处理程序仅在Api路由匹配时执行。简而言之,上图没有正确描述拆分

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

路由是将url与一组字符串段匹配以生成将路由键映射到路由值的
routeValue
的步骤<代码>路由值
然后用于操作选择。委派处理程序在这两个步骤之间运行

MVC中没有类似的方法来授权处理程序,类似的方法是编写您自己的处理程序,但您在这方面遇到了一些困难,特别是在链接生成方面

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

逐行回答 HttpMessageHandler是ASP.NET Web API的一部分,而不是ASP.NET MVC的一部分吗? 是的,它们只是WebAPI构造

MVC中的HttpMessageHandler等价物是什么(图中的等价物)? 没有一个是真的存在的,这个图表是错误的。最近的是一个路线管理员

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

Web API请求与MVC请求有根本的不同吗? 不,它们不是,分叉只在路由之后发生


编辑(2015年8月18日):在MVC核心中,Web API被合并到MVC中,并且有一个新的管道。您可以扩展分叉吗?MVC与Web Api路由的匹配发生在哪里?当您在IIS上运行(这是默认设置)时,路由发生在ASP.NET中。每个路由注册一个“模式”(或者实际上是一个匹配函数)查看
route
RouteBase
方法
GetRouteData
,当方法返回值时,表示路由匹配,然后是注册的(每个RouteBase对象)IRouteHandler已被调用。以下是一些链接:General asp.net routing:IRouteHandler:Route class:我没有将此标记为答案,因为从阅读和,它看起来像是
MvcHandler
相当于
HttpControllerHandler
,并且
HttpApplication.MapRequestHandler
在路由期间而不是之后在它们之间进行选择。路由选择一条路由,一条路由就有一个路由处理程序。有两个像你提到的处理程序,这就是为什么我说MvcHandler与委派处理程序不同,因为委派处理程序在处理程序之后插入,并且可以链接。