Asp.net web api 每个路由和全局的ASP.NET Web API自定义消息处理程序

Asp.net web api 每个路由和全局的ASP.NET Web API自定义消息处理程序,asp.net-web-api,asp.net-web-api2,asp.net-web-api-routing,asp.net-routing,Asp.net Web Api,Asp.net Web Api2,Asp.net Web Api Routing,Asp.net Routing,我有3个ASP.NET Web API消息处理程序: Handler1 Handler2 授权处理人 Handler1和Handler2是全局的(适用于所有路由),一个处理程序(AuthorizeHandler)适用于一个路由 但是,我在实施过程中遇到了一些问题: public static void Register(HttpConfiguration config) { config.MessageHandlers.Add(new Ha

我有3个ASP.NET Web API消息处理程序:

  • Handler1
  • Handler2
  • 授权处理人
Handler1和Handler2是全局的(适用于所有路由),一个处理程序(AuthorizeHandler)适用于一个路由

但是,我在实施过程中遇到了一些问题:

  public static void Register(HttpConfiguration config)
    {            
        config.MessageHandlers.Add(new Handler1());  //this will apply to all routes
        config.MessageHandlers.Add(new Handler2());  //this will apply to all routes


        config.MapHttpAttributeRoutes();


        config.Routes.MapHttpRoute(
          name: "FreeAPI",
          routeTemplate: "api/free/{controller}/{action}/{id}",
          defaults: new { id = RouteParameter.Optional }
        );


        config.Routes.MapHttpRoute(
            name: "SecretAPI",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional },
            constraints: null,
            handler: new AuthorizeHandler()  // this will apply just to this route
                         { 
                            InnerHandler = new HttpControllerDispatcher(config) 
                         }
        );       

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
基本上,我试图做的是创建一个匿名路由,任何人都可以在没有身份验证的情况下呼叫,并且创建一个需要身份验证才能访问它的路由

然而,我所做的这个实现不起作用

例如,我希望将此端点:
api/free/someanonymouscontroller/someanonymousaction/someanonymousid
设置为匿名,并将此端点
api/somesecurecontroller/somesecureaction/somesecureid
设置为需要身份验证的安全端点

如果我使用fiddler来测试它,在这个端点上:
api/somesecurecontroller/somesecureaction/somesecureid
如果我使用这个ednpoint:
api/free/somesecurecontroller/somesecureaction/somesecureid
(注意自由路径)我可以访问安全端点,而无需处理程序触发…

Hmm

为了工作,我做了以下修改。我从模板{controller}中删除并添加到defaults controller=“free”。现在所有的请求都将被发送到正确的位置

这是正确的方法吗

    config.Routes.MapHttpRoute(
      name: "FreeAPI",
      routeTemplate: "api/free/{action}/{id}",
      defaults: new { controller="free", id = RouteParameter.Optional }
    );