我刚刚为我的项目添加了一个新的Web API控制器。现在,我试图从JavaScript调用控制器。但首先我也有兴趣手动调用不拉动任何东西的路线。它说“找不到页面”。
我的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" }};
}
}
我正在尝试使用以下网址访问它:
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)
更新:这是我更新的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 :(得分:14)
我遇到了类似的问题,我决定从this website下载示例并比较差异。最后,我通过在Global.asax.cs文件中切换路由注册函数调用的顺序来解决我的问题。
而不是:
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.RegisterRoutes);
首先调用WebApiConfig.RegisterRoutes,即:
GlobalConfiguration.Configure(WebApiConfig.RegisterRoutes);
RouteConfig.RegisterRoutes(RouteTable.Routes);
我还在调查背后的原因。但希望这可能会有所帮助。
答案 1 :(得分:2)
我建议使用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
}
答案 2 :(得分:1)
当您将路线放入RouteConfig.cs时,您正在寻找MVC控制器。您应该将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 }
);
修改强>
行动的位置并不重要。只要您在Global.asax.cs中从Application_Start()
调用它,您就可以添加类似
GlobalConfiguration.Configure((config) =>
{
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
});
答案 3 :(得分:0)
您的API路由没有定义操作,路由引擎无法访问您:
http://localhost:54907/api/flights // The resource not found
此路线未定义操作或默认。路由引擎会将您带到控制器,但没有动作(方法)映射到。
http://localhost:54907/MyProject/api/flights // resource not found
除非您将应用程序映射到&#34; MyProjects&#34;在IIS或类似的情况下,您将遇到与上述相同的问题。