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