Подтвердить что ты не робот

Asp.net webapi 2 маршрутизация атрибутов не работает

У меня есть visual studio 2012, установленная с mvc4 с использованием .net framework 4.5. Теперь я хочу использовать webapi2 с написанием атрибута, и я хочу, чтобы моя страница hlep отображала все конечные точки должным образом.

В моем решении я добавил новый проект emtpy базы данных mvc4 и использовал nuget я upgrade to mvc5, а затем установил пакеты webapi2. наконец, я установил пакет справки для webapi2.

теперь, когда я использую rubeprefix, я не вижу никакого содержимого на странице справки, и когда я пытаюсь получить доступ к своей конечной точке webapi в браузерах, это вызывает следующую ошибку.

http://expressiis.com/api/v1/

   <Error>
    <Message>
    No HTTP resource was found that matches the request URI 'http://expressiis.com/api/v1/'.
    </Message>
    <MessageDetail>
    No type was found that matches the controller named 'v1'.
    </MessageDetail>
    </Error>

namespace WebApi.Controllers
{
    [RoutePrefix("api/v1")]
    public class SubscribersController : ApiController
    {
        // GET api/<controller>   
        [Route("")]
        [HttpGet]
        public IQueryable<string> Get()
        {
            return new string[] { "value1", "value2" }.AsQueryable();
        }


    }
}
4b9b3361

Ответ 1

Основываясь на вашей информации, похоже, что вы не вызываете httpConfig.MapHttpAttributeRoutes() (убедитесь, что вы вызываете это перед любыми традиционными регистрациями маршрутизации)

Поскольку вы не вызывали MapHttpAttributeRoutes, ваш запрос, похоже, соответствует традиционному маршруту, например, как api/{controller}. Это не будет работать, потому что маршруты, соответствующие традиционным маршрутам, никогда не будут видеть контроллеры/действия, украшенные маршрутами атрибутов.

Ответ 2

Проблема, с которой я столкнулся, связана с порядком в Application_Start(). Обратите внимание на порядок конфигурации веб-API ниже:

Это НЕ работает

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
    GlobalConfiguration.Configure(WebApiConfig.Register);
}

Это работает

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

Ответ 3

У меня тоже была эта проблема, и после долгого поиска я понял, что использовал System.Web.Mvc.RouteAttribute вместо System.Web.Http.RouteAttribute Исправив это и используя config.MapHttpAttributeRoutes() everything worked fine.

Ответ 4

Это не ваш случай (как видно из вашего примера кода), но, пожалуйста, не забудьте закончить имя класса контроллера с помощью Controller.

Иначе он не будет подхвачен config.MapHttpAttributeRoutes();.

Ответ 5

У этого вопроса уже есть выбранный ответ. Но у меня было другое решение для себя и думаю, что было бы полезно ответить, если выбранный ответ не поможет.

Для меня это была глупая ошибка. У меня было два контроллера, но работал только один. Решения заключались в том, что мой класс контроллера был назван неправильно!

Мой рабочий контроллер -

public class FooController : ApiController { }

Мой нерабочий контроллер -

public class BarControllers : ApiController { }

Убедитесь, что ваш класс контроллера заканчивается на Controller. Конечный s получил меня!

Ответ 6

В моем случае VS создаст мой контроллер с именем

TestController1

Я не знаю, почему он поставил это число "один" в конце имени, но удалил и будет работать.

Ответ 7

Убедитесь, что у вас нет двух контроллеров с одинаковым именем! Я переносил некоторые контроллеры из одной сборки, которую я выбрасывал на веб-сайт... в то время как на веб-сайте больше не было ссылок на старую сборку, которую делали другие сборки, что означало, что она была скопирована в папку bin WebSite. Казалось, что процесс обнаружения маршрута молча провалился, когда он натолкнулся на два вхождения одного и того же контроллера!

Ответ 8

В моем случае следующая строка создавала проблему, просто прокомментировала ее и все начало работать

config.MapHttpAttributeRoutes();

Прокомментировать это в файле WebApiConfig.cs