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

ASP.NET Web Api configuring a specific route not executing message handler

我正在尝试配置特定路由以在消息处理程序到达控制器之前执行它,但是消息处理程序从未执行过。

我有以下控制器:

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。是否可以使用 "private/users" 之类的硬编码 routeTemplate 而不是默认的 "{controller}/{id}" 来实现路由特定配置] 格式?

我想要做的是让我的 TokenValidationHandler 为我所有的私有 api 调用触发,并让 public api 调用绕过 TokenValidationHandler。

属性路由在基于约定的路由之前匹配。相关操作标有 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