介绍问题
我最近了解到,对ApiController
操作的调用会触发DelegatingHandler
的{{1}}方法,并调用香草SendAsync
行动不会触发它。
搜索和研究
我已经研究过Web Api,并了解到它包含Controller
,它是HttpMessageHandler
类的父级。这让我相信HTTP消息处理程序通常只作为Web API管道的一部分执行。
此外,Http Message Handlers run before Url Routing,因此可能不是在Web API和MVC管道之间选择的URL路由。
...考虑使用动作过滤器而不是消息处理程序[因为]过滤器 执行URI路由后运行。
问题
DelegatingHandler
是ASP.NET Web API的一部分,而不是ASP.NET MVC的一部分吗?HttpMessageHandlers
等价物是什么(图中的等效)?我的感觉就是这样,但请纠正我。
HttpMessageHandler
有用的链接
答案 0 :(得分:30)
好吧,因为它们运行两个不同的执行路径,如果MVC路由匹配它然后执行MVCHandler,而委托处理程序仅在Api路由匹配时执行。简而言之,上图没有正确描述拆分。
委托处理程序在路由后和操作选择之前运行。路由和操作选择步骤经常混淆或互换使用,尽管它们是两个不同的步骤。
路由是将url与一组字符串段匹配以产生RouteValues
的步骤,该RouteValues
将路由键映射到路由值。然后在行动选择中使用{{1}}。委派处理程序在这两个步骤之间运行。
在MVC中没有用于委派处理程序的等效方法,类似的方法是编写自己的处理程序,但是你在那里深入了解,特别是链接生成。
另一种更简单的方法是编写全局过滤器,但请注意,只有在实际选择了某个操作时才会运行。
是的,它们只是WebAPI构造。
没有确实存在,图表是错误的。最接近的是RouteHandler
匹配WebAPI路由
不,他们不是,只在路由后才发生分叉。