ASP.NET MVC消息处理程序与Web API消息处理程序
我创建了2个项目:
- 正常的,基本的ASP.NET MVC 4应用程序
- 基本的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 Handlers
( HTTP 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完全不同,因为您的断点并不适合您想要的地方。
希望有所帮助