[英]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调用,并让公共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 },
//...
);
否则,如果您首选属性路由,则可以考虑使用操作过滤器 。
根据明确的意图,您最好在ASP.NET Web API 2中使用身份验证筛选器
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.