ASP.NET MVC消息处理程序与Web API消息处理程序

我创建了2个项目:

  1. 正常的,基本的ASP.NET MVC 4应用程序
  2. 基本的ASP.NET WebAPI应用程序

我做的是我添加了自定义消息处理程序,从DelegatingHandler派生到它们。 这里是:

 public class MyHandler : DelegatingHandler { protected override Task 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应用程序的ApiController,如http://localhost:7120/Home不会触发断点。

如下面Microsoft着名的ASP.NET Web API: HTTP Message LIFECYLE图所示,ASP.NET Web API有一个额外的可扩展点,称为Message HandlersHTTP Message Handlers Message Handlers部分)。

到目前为止,ASP.NET MVC(目前为5)并没有提供这样的可扩展性。

[链接到全尺寸PDF海报]

在此处输入图像描述

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

您可以比较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完全不同,因为您的断点并不适合您想要的地方。

希望有所帮助