2016-11-10 2 views
6

Вопрос касается определения пользовательских маршрутов с помощью атрибута Route.Web API 2 routing - атрибут маршрута

Я знаю, что в WebApiConfig классе вы всегда определить маршрут по умолчанию,

configuration.Routes.MapHttpRoute("API Default", "api/{controller}/{id}", 
    new { id = RouteParameter.Optional }); 

То, что я не могу работать, когда я хочу передать другой параметр. Я знаю, что могу сделать это (ниже код определен под маршрутом по умолчанию, перечисленных выше):

//configuration.Routes.MapHttpRoute(
    // name: "GetBrandImagePaths", 
    // routeTemplate: "api/{controller}/{id}/{type}"); 

Но я предпочел бы, вместо того, чтобы определить все эти маршруты в файле WebApiConfig, используйте пользовательскую маршрутизацию. Однако, если у меня нет прокомментированного выше кода в файле, я получаю 404. Там, ведущий меня, верит, что пользовательский Route даже не смотрит.

public class HelperApiController : ApiController 
{ 
    [HttpGet] 
    [Route("api/helperapi/{id}/{type}")] 
    public string GetBrandImages(int id, string type) 
    { 
     ..... 
    } 
} 

Как я могу это так, я могу использовать маршруты, определенные в файле WebApiConfig, и определение пользовательских маршрутов внутри отдельных контроллеров API.

Обратите внимание, что этот проект также является проектом MVC (а не только WebApi). Есть что-то, чего я не вижу, неправильно и т. Д.? Я знаю, что существует множество сообщений, в которых описано, как передавать несколько параметров, но я думаю, что мой вопрос немного более конкретен в отношении того, почему он работает, а не другой.

ответ

13

Необходимо позвонить по телефону config.MapHttpAttributeRoutes().

Это проанализирует все классы Controller и выведет маршруты из атрибутов.

Я бы не смешивал это со стандартной маршрутизацией.

+0

Так, если добавить, что вызов, делает это испортит другие маршруты по умолчанию? (результаты действия и т. д.)? Можно ли с уверенностью сказать, что использование 'config.MapHttpAttrubteRoutes()' предназначено только для прямых проектов WebApi? –

+0

Нет, он не перезаписывает маршруты, которые вы вводите вручную. Однако не украшайте эти классы «Controller» любыми атрибутами маршрутизации, иначе вы получите дублирующие и потенциально конфликтующие маршруты. Я только использовал атрибуты маршрутизации для проектов WebApi, поэтому не могу комментировать их соответствие с MVC. – toadflakz

+0

Так что, если я не украшу какие-либо другие контроллеры (не-Api) с 'Route' или' RoutePrefix', они все равно отправятся на правильные конечные точки? –

5

Attribute Routing in ASP.NET Web API 2

Включение маршрутизации Атрибут

Чтобы включить маршрутизацию атрибута, вызовите MapHttpAttributeRoutes во конфигурации. Этот метод расширения определен в файле System.Web.Http.HttpConfigurationExtensions.

using System.Web.Http; 

namespace WebApplication 
{ 
    public static class WebApiConfig 
    { 
     public static void Register(HttpConfiguration config) 
     { 
      // Web API routes 
      config.MapHttpAttributeRoutes(); 

      // Other Web API configuration not shown. 
     } 
    } 
} 

Маршрутизация атрибутов может быть объединена с маршрутизацией на основе конвенций. Для определите маршруты, основанные на протоколах, вызовите метод MapHttpRoute.

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Attribute routing. 
     config.MapHttpAttributeRoutes(); 

     // Convention-based routing. 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 
Смежные вопросы