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与委派处理程序不同,因为委派处理程序在处理程序之后插入,并且可以链接。