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

时间:2013-09-18 19:05:33

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

我创建了2个项目:

  1. 普通的基本ASP.NET MVC 4应用程序
  2. 基本ASP.NET WebAPI应用程序
  3. 我做的是将自定义消息处理程序从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,则不会触发的断点。< / p>

2 个答案:

答案 0 :(得分:6)

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

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

[Link to the full size PDF poster]

enter image description here

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

答案 1 :(得分: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完全不同,因为你的断点并不适合你想要的地方。

希望有所帮助。