介绍问题
我最近了解到,对ApiController
Action的调用将触发DelegatingHandler
的SendAsync
方法,而对普通Controller
Action的调用将不会触发它的方法。
搜索与研究
我研究了Web Api,并了解到它包含HttpMessageHandler
,这是DelegatingHandler
该类的父级。这使我相信,HTTP消息处理程序通常仅作为Web API管道的一部分执行。
另外,Http消息处理程序在Url路由之前运行,因此在Web API和MVC管道之间进行选择的可能不是URL路由。
...考虑使用操作过滤器而不是消息处理程序,因为执行URI路由后将运行过滤器。
问题
HttpMessageHandlers
ASP.NET Web API的一部分,而不是ASP.NET MVC的一部分吗?HttpMessageHandler
在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与一组字符串段进行匹配以生成的步骤,该步骤RouteValues
将路由键映射到路由值。RouteValues
然后用于动作选择。委托处理程序在这两个步骤之间运行。
MVC中没有委派处理程序的等效方法,类似的方法是编写您自己的处理程序,但是您在那里陷入了困境,尤其是在链接生成方面。
另一种更简单的方法是编写全局过滤器,但请注意,只有在实际选择了动作的情况下,它才会运行。
是的,它们只是WebAPI构造。
确实不存在,该图是错误的。最接近的是RouteHandler
匹配WebAPI路由
不,它们不是,分支仅在路由之后发生。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句