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
我正在尝试配置特定路由以在消息处理程序到达控制器之前执行它,但是消息处理程序从未执行过。
我有以下控制器:
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