【问题标题】:ASP.NET MVC Message Handlers vs Web API Message HandlersASP.NET MVC 消息处理程序与 Web API 消息处理程序
【发布时间】:2013-09-18 19:05:33
【问题描述】:

我创建了 2 个项目:

  1. 普通、基本的 ASP.NET MVC 4 应用程序
  2. 基本的 ASP.NET WebAPI 应用程序

我所做的就是将源自DelegatingHandler 的自定义消息处理程序添加到它们两者。这里是:

public class MyHandler : DelegatingHandler
{
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
    {
        return base.SendAsync(request, cancellationToken);
    }
}

我都在global.asax注册了:

GlobalConfiguration.Configuration.MessageHandlers.Add(new MyHandler());

我在

中放了一个断点
return base.SendAsync(request, cancellationToken);

ASP.NET MVC 和 ASP.NET WebAPI 的区别在于,当我调用 ASP.NET MVC 应用程序 (http://localhost:4189/Something) 不会触发断点。但是,当我调用 Web API (http://localhost:7120/api/values) 时,会触发断点 。

这是为什么呢?这些应用程序类型的执行流程有什么不同吗?

另外,当我尝试请求普通的Controller,而不是ApiController的WebAPI应用程序,比如http://localhost:7120/Home,断点没有触发。

【问题讨论】:

  • 那是因为 MessageHandlers 只在 WebApi 管道中被调用,而不是 MVC 管道。
  • @MystereMan 的评论是正确答案。
  • @MikeWasson 是的,这是正确的。我将发布另一个关于这些管道特定差异的问题。
  • @MystereMan,我建议您发布此问题的答案并详细说明管道有何不同。
  • @MikeWasson 感谢您关于该主题的所有文章。他们非常有帮助。

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


【解决方案1】:

如下面著名的微软ASP.NET Web API: HTTP Message LIFECYLE 图表所示,ASP.NET Web API 有一个额外的扩展点,称为Message Handlers(HTTP Message Handlers 部分)。

到目前为止,ASP.NET MVC(目前为 5 个)还没有提供这样的扩展点。

[Link to the full size PDF poster]

MVC 和 WebAPI 共享(或至少在概念上)的唯一可扩展点是过滤器。请注意,MVC 和 WebAPI 有不同的方法来注册过滤器,这会使许多人处于与您现在所处的情况相似的情况。

【讨论】:

    【解决方案2】:

    可以比较MVC和WebAPI的路由配置方式

    对于 MVC

    可用的重载是,

      public static class RouteCollectionExtensions
        {
    
            public static VirtualPathData GetVirtualPathForArea(this RouteCollection routes, RequestContext requestContext, RouteValueDictionary values);
    
            public static VirtualPathData GetVirtualPathForArea(this RouteCollection routes, RequestContext requestContext, string name, RouteValueDictionary values);
    
            public static void IgnoreRoute(this RouteCollection routes, string url);
    
            public static void IgnoreRoute(this RouteCollection routes, string url, object constraints);
    
            public static Route MapRoute(this RouteCollection routes, string name, string url);
    
            public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults);
    
            public static Route MapRoute(this RouteCollection routes, string name, string url, string[] namespaces);
    
            public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints);
           namespaces.
    
            public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, string[] namespaces);
    
            public static Route MapRoute(this RouteCollection routes, string name, string url, object defaults, object constraints, string[] namespaces);
        }
    

    对于 WebAPI

        public static class HttpRouteCollectionExtensions
        {
            public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate);
    
            public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults);
    
            public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints);
    
            public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints, HttpMessageHandler handler);
    
        }
    

    看,最后一个webapi路由配置方法有一个参数,你可以传入你想要的自定义HttpMessageHandler。 MVC 路由在其管道中没有该规定。

    总而言之,MVC 执行上下文和管道与 WebAPI 完全不同,因为您的断点不会停留在您想要的位置。

    希望有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-26
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多