WebApi 中控制器名称的带连字符的 URL
Hyphenated urls for controller name in WebApi
我正在尝试将看起来像 /action-figure/
的 url 映射到 ActionFigureController
。即,让我的 url 为控制器分隔连字符。
类似于 this answer exactly,但用于 WebApi 而不是 MVC 路由。
请问如何在 WebApi 中配置我的 urls?
几乎所有 google 搜索都将我引导至 MVC 路由配置,但我无法找到与之对应的:
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
因为 MvcRouteHandler
不适用于此,我什至不确定在哪里传递自定义路由配置。
虽然可能无法像 ASP.NET MVC 那样设置多个路由,但请尝试 Attribute Routing 使用易于使用的注释来指定路由。
要启用属性路由,您需要在 Register
方法中进行设置:
config.MapHttpAttributeRoutes();
这让您可以方便地为每个方法设置路由:
[Route("customers/{customerId}/orders")]
public IEnumerable<Order> GetOrdersByCustomer(int customerId) { ... }
此外,RoutePrefix
允许避免重复提供整个路径:
[RoutePrefix("api/books")]
public class BooksController : ApiController
{
// GET api/books
[Route("")]
public IEnumerable<Book> Get() { ... }
// GET api/books/5
[Route("{id:int}")]
public Book Get(int id) { ... }
// POST api/books
[Route("")]
public HttpResponseMessage Post(Book book) { ... }
}
编辑 回到您的评论:
看看这个 answer 以及 DefaultHttpControllerSelector
的派生和填充逻辑的方式:
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Dispatcher;
public class ApiControllerSelector : DefaultHttpControllerSelector
{
public ApiControllerSelector (HttpConfiguration configuration) : base(configuration) { }
public override string GetControllerName(HttpRequestMessage request)
{
// add logic to remove hyphen from controller name lookup of the controller
return base.GetControllerName(request).Replace("-", string.Empty);
}
}
要完成这项工作,您需要在配置中指定自定义 ApiControllerSelector
,如下所示:
config.Services.Replace(typeof(IHttpControllerSelector),
new ApiControllerSelector(config));
我正在尝试将看起来像 /action-figure/
的 url 映射到 ActionFigureController
。即,让我的 url 为控制器分隔连字符。
类似于 this answer exactly,但用于 WebApi 而不是 MVC 路由。
请问如何在 WebApi 中配置我的 urls?
几乎所有 google 搜索都将我引导至 MVC 路由配置,但我无法找到与之对应的:
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
因为 MvcRouteHandler
不适用于此,我什至不确定在哪里传递自定义路由配置。
虽然可能无法像 ASP.NET MVC 那样设置多个路由,但请尝试 Attribute Routing 使用易于使用的注释来指定路由。
要启用属性路由,您需要在 Register
方法中进行设置:
config.MapHttpAttributeRoutes();
这让您可以方便地为每个方法设置路由:
[Route("customers/{customerId}/orders")]
public IEnumerable<Order> GetOrdersByCustomer(int customerId) { ... }
此外,RoutePrefix
允许避免重复提供整个路径:
[RoutePrefix("api/books")]
public class BooksController : ApiController
{
// GET api/books
[Route("")]
public IEnumerable<Book> Get() { ... }
// GET api/books/5
[Route("{id:int}")]
public Book Get(int id) { ... }
// POST api/books
[Route("")]
public HttpResponseMessage Post(Book book) { ... }
}
编辑 回到您的评论:
看看这个 answer 以及 DefaultHttpControllerSelector
的派生和填充逻辑的方式:
using System.Net.Http;
using System.Web.Http;
using System.Web.Http.Dispatcher;
public class ApiControllerSelector : DefaultHttpControllerSelector
{
public ApiControllerSelector (HttpConfiguration configuration) : base(configuration) { }
public override string GetControllerName(HttpRequestMessage request)
{
// add logic to remove hyphen from controller name lookup of the controller
return base.GetControllerName(request).Replace("-", string.Empty);
}
}
要完成这项工作,您需要在配置中指定自定义 ApiControllerSelector
,如下所示:
config.Services.Replace(typeof(IHttpControllerSelector),
new ApiControllerSelector(config));