2017-09-26 63 views
1

我想配置一个特定的路由来执行消息处理程序,然后它击中控制器,但消息处理程序永远不会执行。ASP.NET Web Api配置特定的路由不执行消息处理程序

我有以下控制器:

public class TestController : ApiController 
{ 
    [Route("private/users")] 
    public IHttpActionResult Get() 
    { 
     return Ok(); 
    } 
} 

而下面的路由配置:

 config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "private/users", 
      defaults: new { id = RouteParameter.Optional }, 
      constraints: null, 
      handler: new TokenValidationHandler() { InnerHandler = new HttpControllerDispatcher(config) } 
     ); 

而且MessageHandler的是这样的:

public class TokenValidationHandler : DelegatingHandler 
{ 
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     //some logic to validate token 
     return base.SendAsync(request, cancellationToken); 
    } 
} 

永远不会执行该TokenValidationHandler这似乎是因为配置路由时的routeTemplate。是否可以使用硬编码的routeTemplate(如“private/users”而不是默认的“{controller}/{id}”格式)实现路由特定配置?

我想要做的就是让我的TokenValidationHandler为我所有的私人api调用启动,并让公共API调用绕过TokenValidationHandler。

回答

2

属性路由在基于约定的路由之前匹配。相关操作标有Route属性。如果启用了属性路由,那么这意味着它不会达到基于约定的路由,因此不会调用处理程序。

删除路由属性

public class TestController : ApiController { 
    public IHttpActionResult Get() { 
     return Ok(); 
    } 
} 

航线登记的先后顺序也起着因素以公约为基础的路线,从而确保通用路由具体路由

config.Routes.MapHttpRoute(
    name: "PrivateApi", 
    routeTemplate: "private/users", 
    defaults: new { id = RouteParameter.Optional }, 
    constraints: null, 
    handler: new TokenValidationHandler() { InnerHandler = new HttpControllerDispatcher(config) } 
); 

//more general route 
config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional }, 
    //... 
); 

否则,如果以后注册属性路由是你的首选,你可以考虑使用action filter

基于声明的意图,你会使用Authentication Filters in ASP.NET Web API 2

+0

感谢您的答复会更好。我已经在我的应用程序中使用了属性路由。这是否意味着我必须使用动作过滤器来实现我需要的基于路线的配置? – shane87

+1

@ shane87,是的。考虑使用认证过滤器。 – Nkosi