2016-01-07 2 views
3

Я пытаюсь отобразить свои URL-адреса, которые выглядят как /action-figure/, на ActionFigureController. то есть, мой url будет дефис отделен для контроллеров.Дешифрованные URL-адреса для имени контроллера в WebApi

Что-то вроде this answer exactly, но для WebApi вместо маршрутизации MVC.

Как настроить мои URL-адреса в WebApi, пожалуйста?

Почти все поисковые Google направляет меня к конфигурации маршрутизации MVC и я не могу найти эквивалент этого для:

config.MapHttpAttributeRoutes(); 

config.Routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

, как MvcRouteHandler не относится к этому, и я не уверен, где даже перейдите в конфигурацию настраиваемого маршрута.

ответ

1

Хотя может быть невозможно установить несколько маршрутов, как в 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) { ... } 
} 

EDIT Возвращаясь на ваш комментарий:

Посмотрите на эту answer и тем, как DefaultHttpControllerSelector происходит от и наполненной некоторой логики:

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

привет, спасибо, не существует никакого способа, чтобы глобально Configure, с немного логики, чтобы включить контроллеры ГорбатыйРегистр в дефис s перенаправленные URL? – LocustHorde

+0

См. Обновленный ответ, есть способ, по крайней мере, перехватить запрос и изменить там параметр контроллера. – rdoubleui

+0

Отлично, спасибо! – LocustHorde

Смежные вопросы