2015-04-16 5 views
3

Я только что добавил в свой проект новый контроллер веб-API. Теперь я пытаюсь вызвать контроллер из JavaScript. Но сначала мне также интересно вручную вызвать маршрут, который ничего не подтягивает. В нем говорится «Страница не найдена».API-интерфейс API-интерфейса ASP.NET не найден

Мои RegisterRoutes методами показано ниже:

public static void RegisterRoutes(RouteCollection routes) 
     { 
      routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

      routes.MapRoute(
       name: "DefaultApi", 
       url: "api/{controller}/{id}", 
       defaults: new { id = UrlParameter.Optional } 
      ); 

      routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
      ); 
     } 

Мой контроллер API называется FlightsController:

public class FlightsController : ApiController 
    { 
     public IEnumerable<FlightViewModel> GetAllFlights() 
     { 
      return new List<FlightViewModel>() { new FlightViewModel() { Name = "Some Flight" }}; 
     } 
} 

Я пытаюсь получить к нему доступ с помощью следующего URL:

http://localhost:54907/api/flights // The resource not found 
http://localhost:54907/MyProject/api/flights // resource not found 
api/flights // name not resolved 

Что я делаю не так?

версия: Я добавил новый файл в мой каталог контроллеров, который называется «Web API контроллеров класса (v2.1)

UPDATE: Вот мой обновленный web.config

protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 
      FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 

      GlobalConfiguration.Configure(WebApiConfig.RegisterRoutes); 

      BundleConfig.RegisterBundles(BundleTable.Bundles); 

     } 
+0

Сообщите нам, какую версию рамки WebApi/MVC вы используете, чтобы мы могли помочь вам лучше. WebApi прошел множество изменений, которые могут повлиять на эту проблему. –

+0

Web API Controller (v2.1), .NET 4.5, ASP.NET MVC runtime version 4.0 –

+0

Где вы называете 'RegisterRoutes (..)' from? – janhartmann

ответ

0

Ваш маршрут API не имеет действие, определенное и двигатель маршрутизации не может получить вас там:

http://localhost:54907/api/flights // The resource not found 

Этот маршрут не имеет определенное действие или значение по умолчанию. Механизм маршрутизации приведет вас к контроллеру, но не имеет действия (метод) для сопоставления.

http://localhost:54907/MyProject/api/flights // resource not found 

Если вы не отображается приложение к «MyProjects» в IIS или аналогичные вы столкнетесь с той же проблемой, что и выше.

+0

. Как я могу определить, что мне не хватает? –

+0

Измените routing 'url:" api/{controller}/{action}/{id} 'и вызовите' http: // localhost: 54907/api/flight', чтобы увидеть его функцию. Затем вы можете изменить 'GetAllFlights' на –

+0

То же самое, что я написал в исходном сообщении. Страница не существует –

3

Я предлагаю использовать HttpAttributeRoutes

Украсьте ваш контроллер

[RoutePrefix("api/flights")] 
    public class FlightsController : ApiController 
    { 
     [Route("")] 
     public IEnumerable<FlightViewModel> GetAllFlights() 
     { 
      return new List<FlightViewModel>() { new FlightViewModel() { Name = "Some Flight" }}; 
     } 
    } 

Зарегистрировать маршруты ...

public static class WebApiConfig 
    { 
     #region Public Methods and Operators  

     public static void RegisterRoutes(HttpConfiguration config) 
     { 
      // Web API routes 
      config.MapHttpAttributeRoutes(); 
     } 

     #endregion 
    } 
1

Вы ищете контроллер MVC, когда вы кладете маршрут в RouteConfig. CS. Вы должны перенести маршрут api в App_Data/WebApiConfig.cs.

RouteConfig:

routes.MapRoute(
    name: "Default", 
    url: "{controller}/{action}/{id}", 
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

WebApiConfig:

config.MapHttpAttributeRoutes(); 

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

Edit: Это действительно не имеет значения, где действие находится. До тех пор, как вы это называете из Application_Start() в Global.asax.cs вы можете просто добавить что-то вроде

GlobalConfiguration.Configure((config) => 
{ 
    config.MapHttpAttributeRoutes(); 

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

Я не могу добавить файлы в папку App_Data вручную. И в настоящее время эта папка пуста. –

+0

Я вызываю использование http: // localhost: 54907/MyProject/api/полеты он по-прежнему не возвращает noting –

+0

вытащить MyProject при использовании IISExpress. – cheesesharp

9

У меня были подобные проблемы, и я решил загрузить пример из this website и сравнить разницу.В конце концов, я исправил свою проблему, переключив последовательность вызовов функции регистрации маршрута в файле Global.asax.cs.

Вместо:

RouteConfig.RegisterRoutes(RouteTable.Routes); 
GlobalConfiguration.Configure(WebApiConfig.RegisterRoutes); 

Вызовите WebApiConfig.RegisterRoutes первый, то есть:

GlobalConfiguration.Configure(WebApiConfig.RegisterRoutes); 
RouteConfig.RegisterRoutes(RouteTable.Routes); 

Я до сих пор расследует причины позади. Но надеюсь, что это может помочь.

+0

У меня была аналогичная проблема, и она была исправлена ​​путем изменения порядка. Спасибо ! – Vikram

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