Introduce the Question

我最近了解到,对ApiController操作的调用将触发DelegatingHandlerSendAsync方法,而对香草Controller操作的调用不会触发它.

Search and Research

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

而且,Http Message Handlers run before Url Routing,所以可能不是URL路由在Web API和MVC管道之间做出 Select .

...考虑使用Acter过滤器代替消息处理程序[因为A]

Question

  • 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      |

Helpful Links

ASP.NET Application Lifecycle

ASP.NET Web API Poster

Life Cycle of an ASP.NET MVC 5 Application

推荐答案

为什么对控制器的调用不执行委托处理程序?

因为它们运行在两条不同的执行路径上,如果MVC路由匹配,它就会执行MVCHandler,而委托处理程序只在Api路由匹配时执行.简而言之,上图没有正确描述拆分.

委派处理程序在路由之后和操作 Select 之前运行.尽管路由和动作 Select 步骤是两个截然不同的步骤,但它们经常会混淆或互换使用.

路由是将URL与一组字符串段匹配以产生将路由关键字映射到路由值的RouteValues的步骤.然后在动作 Select 中使用RouteValues.委托处理程序在这两个步骤之间运行.

在MVC中没有类似功能来委托处理程序,类似的方法是编写您自己的处理程序,但是您在这方面遇到了一些麻烦,特别是在链接生成方面.

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

逐行回答

HttpMessageHandler是ASP的一部分.NET Web API,但不是ASP.网络MVC?

是的,它们只是WebAPI构造.

MVC中的HttpMessageHandler类似功能是什么(图中的类似功能)?

没有一个是真正存在的,而且这个图表是错误的.最近的是RouteHandler

是什么导致请求遵循Web API管道(图中的Forking )?

匹配WebAPI路由

Web API请求与MVC请求有根本不同吗?

不,它们不是,Forking 只在路由之后发生.

编辑(2015年8月18日):在MVC核心中,Web API被合并到MVC中,并且有一个新的管道.

Asp.net相关问答推荐

在控制器中通过依赖项注入使用ASP.NET变量值时,不会持久化

如何在运行时判断动态数据类型的类型?

cookie 存储在系统的什么位置?

某些黑客能否从用户那里窃取 Web 浏览器 cookie 并在网站上使用该名称登录?

使 ASP.NET WCF 将字典转换为 JSON,省略键和值标签

未知的网络方法.参数名称:methodName

ASP.NET 平台是否有与 Heroku 等价的工具?

RestSharp 获取请求的完整 URL

SameSite 属性如何自动添加到我的 Asp.net_SessionID cookie 中?

使用 JavaScript 更改 ASP.NET 标签的可见性

UseSqlServer 方法缺少 MVC 6

Ef core:执行 MaxAsync 时序列不包含任何元素

如何在asp.net mvc的html.actionlink中调用javascript函数?

在asp.net mvc 3中实现FilterAttribute,IActionFilter和从ActionFilterAttribute继承有什么区别?

DBContext.Entry 有什么作用?

Cache.Add 绝对过期 - 是否基于 UTC?

MVC 模型布尔显示是或否

如何强制 netwtonsoft json 序列化程序将 datetime 属性序列化为字符串?

解析器错误:此处不允许使用_Default,因为它没有扩展类System.Web.UI.Page和 MasterType 声明

DataTable 不包含 AsEnumerable 的定义