对同一个控制器操作使用属性路由和全局路由
本文关键字:路由 属性 全局 同一个 控制器 操作 | 更新日期: 2023-09-27 18:08:32
所以,我们正在开发一个webapi重的应用程序,服务于多种类型的客户端(包括一个网站,它是一个JavaScript客户端和多个c#客户端),我们希望使用属性路由来制作更友好的url。像这样:
[RoutePrefix(Constants.RoutePrefixes.Api + "foo")]
[HttpPut]
FooController : ApiController
{
[Route("{fooId}/sub/{subFooId}")]
[HttpPut]
public HttpResponseMessage UpdateAFoo(int fooId, int subFooId)
{
return Request.CreateResponse(HttpStatusCode.OK);
}
}
和预期的一样,对/api/foo/1/sub/2的请求会击中这个控制器。
然而,我们有一个内置在默认路由中的消息处理程序来处理身份令牌,并且来自需要特殊行为的客户端的请求仍然必须使用该路由,或者至少运行适当的消息处理程序,以及以下请求(使用另一个路由):/集成/foo ? fooId = 1, subFooId = 2
. .给我一个错误,没有找到合适的控制器来处理请求。如果我删除了route属性,第二个请求就会像预期的那样击中我的action方法。
我在几个地方读到过,你可以同时使用默认路由和属性路由,我在应用程序中都有这两种路由,但我还没有能够在特定的操作中使用这两种路由。
我的路由配置是这样的:
public static void RegisterHttpRoutes(HttpConfiguration configuration)
{
var routes = configuration.Routes;
configuration.MapHttpAttributeRoutes();
routes.MapHttpRoute(
name: Constants.RouteNames.Api,
routeTemplate: Constants.RoutePrefixes.Api + "{controller}/{id}/{p}",
defaults: new { id = RouteParameter.Optional, p = RouteParameter.Optional }
);
routes.MapHttpRoute(
name: Constants.RouteNames.IntegrationApi,
routeTemplate: Constants.RoutePrefixes.IntegrationApi + "{controller}/{id}/{p}",
defaults: new { id = RouteParameter.Optional, p = RouteParameter.Optional },
constraints: null,
handler: new SuperDuperAuthenticationHandler())
);
}
这就是它的工作原理吗?我需要一个不带route属性的单独动作吗?是否有一种方法来指定属性路由的消息处理程序?我可以将属性和约定路由同时应用于同一个操作方法吗?我不太清楚我有什么选择
用属性路由装饰的控制器/动作无法通过常规路由匹配的路由到达…所以你看到的行为是预期的…
属性路由不支持逐路消息处理程序。
你能在你的场景中使用AuthenticationFilterAttribute
吗?如果你需要为一组控制器使用这个过滤器,那么你可以创建一个用这个过滤器装饰的基本控制器,并让所有这些控制器集从它派生。