为什么对ASP.NET MVC控制器的调用不执行DelegatingHandler
本文关键字:调用 执行 DelegatingHandler 控制器 ASP NET MVC 为什么 | 更新日期: 2023-09-27 18:02:16
介绍问题
我最近了解到,对ApiController
Action的调用将触发DelegatingHandler
的SendAsync
方法,而对普通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应用程序的生命周期
为什么对控制器的调用不执行委派处理程序
因为它们运行两个不同的执行路径,如果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请求有根本不同
不,它们不是,分叉只发生在路由之后。