我正在尝试配置一个特定的路由来执行消息处理程序,然后才能到达控制器,但是永远不会执行消息处理程序。
我有以下控制器:
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。
答案 0 :(得分:2)
属性路由匹配在基于约定的路由之前。相关操作标有td
属性。如果启用了属性路由,则表示它不会到达基于约定的路由,因此不会调用处理程序。
删除路线属性
Route
路线登记的顺序也是基于会议的路线的一个因素,因此请确保在更具体的路线之后登记一般路线
public class TestController : ApiController {
public IHttpActionResult Get() {
return Ok();
}
}
否则,如果属性路由是您的首选项,则可以考虑使用action filter。
根据陈述的意图,您最好使用Authentication Filters in ASP.NET Web API 2