找不到ASP.NET Web API路由

时间:2015-04-16 11:08:40

标签: asp.net asp.net-mvc

我刚刚为我的项目添加了一个新的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);

        }

4 个答案:

答案 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或类似的情况下,您将遇到与上述相同的问题。