繁体   English   中英

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

[英]Why does a call to an ASP.NET MVC Controller not execute a DelegatingHandler?

介绍问题

我最近了解到,对ApiController Action的调用将触发DelegatingHandlerSendAsync方法,并且对vanilla Controller Action的调用不会触发它。

搜索和研究

我查看了Web Api,并了解到它包含了HttpMessageHandler ,它是DelegatingHandler类的父级。 这使我相信HTTP消息处理程序通常只作为Web API管道的一部分执行。

此外, Http Message Handlers在Url Routing之前运行 ,因此它可能不是在Web API和MVC管道之间选择的URL路由。

...考虑使用动作过滤器而不是消息处理程序[因为a]过滤器在执行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的步骤,该RouteValues将路由键映射到路由值。 然后在行动选择中使用RouteValues 委托处理程序在这两个步骤之间运行。

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

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

逐行回答

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

是的,它们只是WebAPI构造。

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

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

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

匹配WebAPI路由

Web API请求是否与MVC请求根本不同?

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM