对同一个控制器操作使用属性路由和全局路由

本文关键字:路由 属性 全局 同一个 控制器 操作 | 更新日期: 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吗?如果你需要为一组控制器使用这个过滤器,那么你可以创建一个用这个过滤器装饰的基本控制器,并让所有这些控制器集从它派生。