使用属性路由和全局路由进行相同的控制器操作

时间:2014-06-12 14:21:35

标签: c# asp.net-web-api asp.net-mvc-5 attributerouting

因此,我们正在开发一个支持多种类型客户端的webapi-heavy应用程序(包括一个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的请求将按预期命中此控制器。

但是,我们在我们的一个默认路由中内置了一个消息处理程序来处理身份令牌,来自客户端的请求需要特殊行为的请求仍然必须使用那个路由,或者至少是某些东西运行适当的消息处理程序,以及以下请求(使用该其他路由):

/集成/富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())
        );
    }

这就是它的工作原理吗?我是否需要没有路由属性的单独操作?有没有办法为属性路由指定消息处理程序?我可以将属性和约定路由应用于同一个操作方法吗?我不清楚我的选择是什么。

1 个答案:

答案 0 :(得分:2)

使用属性路径修饰的控制器/操作无法通过传统路由匹配的路径到达...因此您所看到的行为是预期的......

属性路由不支持按路由消息处理程序。

你可以在你的场景中使用AuthenticationFilterAttribute吗?...如果你需要这个过滤器用于一组控制器,那么你可以创建一个用这个过滤器装饰的基本控制器,让所有这些控制器派生自它...