【发布时间】: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