为什么对ASP.NET MVC控制器的调用不执行DelegatingHandler?

肖恩·卢丁(Shaun Luttin)

介绍问题

我最近了解到,对ApiControllerAction的调用将触发DelegatingHandlerSendAsync方法,而对普通ControllerAction的调用将不会触发它的方法。

搜索与研究

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

另外,Http消息处理程序在Url路由之前运行,因此在Web API和MVC管道之间进行选择的可能不是URL路由。

...考虑使用操作过滤器而不是消息处理程序,因为执行URI路由后将运行过滤器。

问题

  • HttpMessageHandlersASP.NET Web API的一部分,而不是ASP.NET MVC的一部分吗?
  • 什么是HttpMessageHandler在MVC(相当于等效图中)?
  • 是什么导致请求遵循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然后用于动作选择。委托处理程序在这两个步骤之间运行。

MVC中没有委派处理程序的等效方法,类似的方法是编写您自己的处理程序,但是您在那里陷入了困境,尤其是在链接生成方面。

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

逐行答案

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

是的,它们只是WebAPI构造。

什么是MVC中的HttpMessageHandler等效项(图中的等效项)?

确实不存在,该图是错误的。最接近的是RouteHandler

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

匹配WebAPI路由

Web API请求与MVC请求在本质上有所不同吗?

不,它们不是,分支仅在路由之后发生。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从Asp.net MVC4控制器调用不同文件夹的视图

来自分类Dev

从Javascript调用ASP.NET MVC 4控制器

来自分类Dev

从 JavaScript 正确调用控制器 - ASP.NET MVC

来自分类Dev

ASP.NET MVC 调用控制器方法 DevExpress

来自分类Dev

Asp.Net MVC:为什么我的视图将NULL模型传递回控制器?

来自分类Dev

为什么我的ASP.NET MVC模型填充在控制器中,但视图中为Null?

来自分类Dev

对ASP.NET MVC控制器的Ajax POST调用,给出net :: ERR_CONNECTION_RESET

来自分类Dev

Asp.net MVC Ajax调用未调用控制器方法

来自分类Dev

ASP.NET MVC:从另一个控制器调用一个控制器

来自分类Dev

从视图调用控制器并将值从视图传递到 asp.net mvc 中的控制器

来自分类Dev

ASP.net Web API:为什么要按请求创建控制器?

来自分类Dev

为什么我的ASP.Net Core Web API控制器不返回XML?

来自分类Dev

ASP.NET MVC-执行控制器操作而无需重定向

来自分类Dev

在ASP.NET MVC中从视图执行控制器-Razor

来自分类Dev

如何防止ASP.NET MVC控制器实例化和执行

来自分类Dev

ASP.NET MVC如何知道要调用的控制器构造函数?

来自分类Dev

如何查看ASP.Net MVC中调用的每个控制器和操作方法?

来自分类Dev

如何通过按钮单击asp.net MVC 4中的调用控制器

来自分类Dev

ASP.NET MVC 4路由匹配,但从不调用控制器

来自分类Dev

ASP.NET MVC 5不调用控制器创建方法

来自分类Dev

Javascript错误导致ASP.NET MVC 5调用控制器方法

来自分类Dev

从javascript调用动作时,asp.net MVC控制器参数为null

来自分类Dev

ASP.NET Core MVC控制器从Ajax调用接收输入参数的null

来自分类Dev

角ASP.NET MVC调用C#控制器函数

来自分类Dev

如何在ASP.NET MVC中使用routeValue参数调用控制器操作

来自分类Dev

如何在ASP.NET MVC中的控制器中调用模型方法

来自分类Dev

如何调用从ASP.Net MVC4控制器方法返回Task <T>的方法?

来自分类Dev

ASP.NET MVC如何知道要调用的控制器构造函数?

来自分类Dev

如何查看ASP.Net MVC中调用的每个控制器和操作方法?

Related 相关文章

  1. 1

    从Asp.net MVC4控制器调用不同文件夹的视图

  2. 2

    从Javascript调用ASP.NET MVC 4控制器

  3. 3

    从 JavaScript 正确调用控制器 - ASP.NET MVC

  4. 4

    ASP.NET MVC 调用控制器方法 DevExpress

  5. 5

    Asp.Net MVC:为什么我的视图将NULL模型传递回控制器?

  6. 6

    为什么我的ASP.NET MVC模型填充在控制器中,但视图中为Null?

  7. 7

    对ASP.NET MVC控制器的Ajax POST调用,给出net :: ERR_CONNECTION_RESET

  8. 8

    Asp.net MVC Ajax调用未调用控制器方法

  9. 9

    ASP.NET MVC:从另一个控制器调用一个控制器

  10. 10

    从视图调用控制器并将值从视图传递到 asp.net mvc 中的控制器

  11. 11

    ASP.net Web API:为什么要按请求创建控制器?

  12. 12

    为什么我的ASP.Net Core Web API控制器不返回XML?

  13. 13

    ASP.NET MVC-执行控制器操作而无需重定向

  14. 14

    在ASP.NET MVC中从视图执行控制器-Razor

  15. 15

    如何防止ASP.NET MVC控制器实例化和执行

  16. 16

    ASP.NET MVC如何知道要调用的控制器构造函数?

  17. 17

    如何查看ASP.Net MVC中调用的每个控制器和操作方法?

  18. 18

    如何通过按钮单击asp.net MVC 4中的调用控制器

  19. 19

    ASP.NET MVC 4路由匹配,但从不调用控制器

  20. 20

    ASP.NET MVC 5不调用控制器创建方法

  21. 21

    Javascript错误导致ASP.NET MVC 5调用控制器方法

  22. 22

    从javascript调用动作时,asp.net MVC控制器参数为null

  23. 23

    ASP.NET Core MVC控制器从Ajax调用接收输入参数的null

  24. 24

    角ASP.NET MVC调用C#控制器函数

  25. 25

    如何在ASP.NET MVC中使用routeValue参数调用控制器操作

  26. 26

    如何在ASP.NET MVC中的控制器中调用模型方法

  27. 27

    如何调用从ASP.Net MVC4控制器方法返回Task <T>的方法?

  28. 28

    ASP.NET MVC如何知道要调用的控制器构造函数?

  29. 29

    如何查看ASP.Net MVC中调用的每个控制器和操作方法?

热门标签

归档