【问题标题】:Using attribute routing and a global route for the same controller action对同一控制器操作使用属性路由和全局路由
【发布时间】:2014-08-02 22:04:38
【问题描述】:

因此,我们正在开发一个为多种类型的客户端(包括一个作为 JavaScript 客户端和多个 C# 客户端的网站)提供服务的 webapi-heavy 应用程序,并且我们希望使用属性路由来制作更友好的 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 的请求将命中此控制器。

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

/integration/foo?fooId=1&subFooId=2

..给我一个错误,找不到合适的控制器来处理请求。如果我删除路由属性,第二个请求会按预期命中我的操作方法。

我在几个地方读到过,您可以同时使用默认路由和属性路由,并且我都在应用程序中工作,但我无法将两者都用于特定操作。

我的路线配置如下所示:

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())
        );
    }

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

【问题讨论】:

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


    【解决方案1】:

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

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

    您可以在您的场景中使用AuthenticationFilterAttribute 吗?...如果您需要为一组控制器使用此过滤器,那么您可能可以创建一个用此过滤器装饰的基本控制器,并让所有这些控制器集从中派生。 ..

    【讨论】:

    • 不幸的是,我需要它用于所有控制器/动作,但仅限于某些客户端 - 到目前为止,我已经通过使用不同路由到相同控制器来解决。我要么复制操作方法(无论如何都是围绕服务实现的瘦包装器),要么放弃属性路由。不管怎样,我想我有我的答案。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-03
    相关资源
    最近更新 更多