为什么调用ASP.NET MVC Controller不执行DelegatingHandler?

时间:2014-05-07 01:39:27

标签: c# asp.net asp.net-mvc asp.net-web-api

介绍问题

我最近了解到,对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的一部分吗?
  • MVC中的HttpMessageHandlers等价物是什么(图中的等效)?
  • 是什么原因导致请求遵循Web API管道(图中的 FORK )?
  • Web API请求与MVC请求根本不同吗?

我的感觉就是这样,但请纠正我。

HttpMessageHandler

有用的链接

ASP.NET Application Lifecycle

ASP.NET Web API Poster

Life Cycle of an ASP.NET MVC 5 Application

1 个答案:

答案 0 :(得分:30)

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

好吧,因为它们运行两个不同的执行路径,如果MVC路由匹配它然后执行MVCHandler,而委托处理程序仅在Api路由匹配时执行。简而言之,上图没有正确描述拆分。

委托处理程序在路由后和操作选择之前运行。路由和操作选择步骤经常混淆或互换使用,尽管它们是两个不同的步骤。

路由是将url与一组字符串段匹配以产生RouteValues的步骤,该RouteValues将路由键映射到路由值。然后在行动选择中使用{{1}}。委派处理程序在这两个步骤之间运行。

在MVC中没有用于委派处理程序的等效方法,类似的方法是编写自己的处理程序,但是你在那里深入了解,特别是链接生成。

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

逐行回答

HttpMessageHandlers是ASP.NET Web API的一部分,而不是ASP.NET MVC的一部分吗?

是的,它们只是WebAPI构造。

MVC中的HttpMessageHandler等价物是什么(图中的EQUIVALENT)?

没有确实存在,图表是错误的。最接近的是RouteHandler

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

匹配WebAPI路由

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

不,他们不是,只在路由后才发生分叉。

EDIT(2015年8月18日):在MVC Core中,Web API被合并到MVC中,并且有一个新的管道。