Маршрутизация Web API — работают только действия с параметром URI

#asp.net-mvc #asp.net-web-api2 #asp.net-web-api-routing #asp.net-apicontroller

#asp.net-mvc #asp.net-web-api2 #asp.net-web-api-routing #asp.net-apicontroller

Вопрос:

У меня был проект web API, который работал нормально. Я объединил его с проектом MVC, и теперь работают только действия с параметром URI. Все остальные действия заканчиваются тем, что 404 не найден, где даже контроллер не найден.

Вот что у меня есть в WebApiConfig (стандартный материал):

 public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services
        // Configure Web API to use only bearer token authentication.
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

        // Web API routes
        config.MapHttpAttributeRoutes();

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

Вот класс контроллера:

 [Authorize]
[RoutePrefix("api/WikiPlan")]
public class WikiPlanController : ApiController
  

Вот действие, которое работает:

 http://localhost:2000/api/WikiPlan/SearchWikiPlans/baby
[AllowAnonymous]
[HttpGet]
[Route("SearchWikiPlans/{keyword}")]
[ResponseType(typeof(List<WikiPlanSearchResultViewModel>))]
public IHttpActionResult SearchWikiPlans(string keyword)
  

Вот одно, которое не работает (которое раньше работало, когда оно было в своем собственном проекте):

 http://localhost:2000/api/WikiPlan/TopWikiPlans
[AllowAnonymous]
[HttpGet]
[Route("TopWikiPlans")]
[ResponseType(typeof(List<TopWikiPlan>))]
public IHttpActionResult TopWikiPlans()
  

Я не знаю, что не так. Спасибо за вашу помощь!

Комментарии:

1. Покажите нам, пожалуйста, объявление класса,

2. Какой URL-адрес, который, как вы утверждали, не работал?

3. Да, класс контроллера

4. Я протестировал, добавив строковый параметр в действие TopWikiPlans, и это сработало. Похоже, по какой-то причине ему нужен параметр.

5. Почему бы вам просто не использовать POST-запрос вместо GET?

Ответ №1:

Благодаря этому инструменту отладчика маршрутов ( http://blogs.msdn.com/b/webdev/archive/2013/04/04/debugging-asp-net-web-api-with-route-debugger.aspx ), Я смог отследить неработающий URL и разобрался с проблемой.

Оказалось, что фреймворк сопоставлял неработающий URL с маршрутом MVC, а не с моими маршрутами API. Итак, я переместил вызов для регистрации маршрутов API поверх маршрута MVC в Global.asax, и теперь он соответствует правильно.