ASP.NET Web Api配置不执行消息处理程序的特定路由

时间:2017-09-26 10:21:05

标签: c# asp.net asp.net-web-api asp.net-web-api-routing

我正在尝试配置一个特定的路由来执行消息处理程序,然后才能到达控制器,但是永远不会执行消息处理程序。

我有以下控制器:

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。

1 个答案:

答案 0 :(得分:2)

属性路由匹配在基于约定的路由之前。相关操作标有td属性。如果启用了属性路由,则表示它不会到达基于约定的路由,因此不会调用处理程序。

删除路线属性

Route

路线登记的顺序也是基于会议的路线的一个因素,因此请确保在更具体的路线之后登记一般路线

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

否则,如果属性路由是您的首选项,则可以考虑使用action filter

根据陈述的意图,您最好使用Authentication Filters in ASP.NET Web API 2