1

Я использую атрибут маршрутизации с Web API, и все работает, как ожидалось, если я прошу URL /MyAPI/список со следующим контроллером:Маршрут по умолчанию при использовании атрибута ASP.NET MVC маршрутизации

[RoutePrefix("myapi")] 
public class MyController : ApiController 
{ 
    [HttpGet] 
    [Route("list")] 
    public async Task<string> Get() 
    { 
     // Return result 
    } 
} 

Однако, я хотел бы мой Get() метода быть по умолчанию, т.е. при запросе URL /MyAPI (без /списка части).

Но если я удалить "список" часть маршрута атрибут как так ...

[RoutePrefix("myapi")] 
public class MyController : ApiController 
{ 
    [HttpGet] 
    [Route] // Default route 
    public async Task<string> Get() 
    { 
     // Return result 
    } 
} 

... Я получаю ошибку 403,14 говоря

«Веб-сервер настроен так, чтобы не отображать содержимое этого каталога ».

Любые идеи о том, что может быть причиной этого?

Спасибо!

Edit: Если я прошу контроллер API, используя шаблон маршрута по умолчанию, как /API/MyAPI, он отображает до Получить() метод, как и ожидалось.

По умолчанию маршрут зарегистрирован после атрибутов маршрутов:

public static void Register(HttpConfiguration config) 
    { 
     config.MapHttpAttributeRoutes(); 

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

У вас есть физический/виртуальный каталог с именем 'myapi'? – haim770

+0

@ haim770 Хм, действительно, это проблема! Если я переименую свой префикс маршрута, маршрут по умолчанию работает так, как ожидалось! Большое спасибо за Вашу помощь! Не стесняйтесь публиковать его в качестве ответа, и я соглашусь с ним. :) –

+1

Это просто напомнило мне о http://stackoverflow.com/a/24533925/1625737 - Не уверен, что он квалифицируется как дубликат, хотя – haim770

ответ

0

Как заостренным O ut haim770 в комментариях: проблема в том, что у меня была физическая папка с с именем в качестве префикса маршрута.

Переименование либо папки, либо префикса маршрута разрешило проблему.

Я предполагаю, что альтернативой было бы настроить порядок маршрута/обработчика, чтобы гарантировать, что маршруты атрибутов имеют приоритет над физическими путями.

+1

Другим возможным решением является использование «routes.RouteExistingFiles = true», как указано в ответе, который я связывал с – haim770

0

Использование

[Route("")] 

маршрут по умолчанию

[RoutePrefix("myapi")] 
public class MyController : ApiController 
{ 
    //GET myapi 
    [HttpGet] 
    [Route("")] // Default route 
    public async Task<string> Get() { ... } 
} 

Ссылка: Attribute Routing in ASP.NET Web API 2 : Route Prefixes

+0

Спасибо @Nkosi, но мне кажется, что отсутствует атрибут ** ** По умолчанию **? –

+0

Это была опечатка.извините – Nkosi

+0

А, ок! :) Я попытался использовать оба ** "" ** и ** "~ /" ** в качестве аргументов для атрибута ** Route **, но он дает тот же результат. :/ –

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