ASP.NET Web API路由未找到。

4

我刚刚在我的项目中添加了一个新的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 Controller Class (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);

        }

请告诉我们您正在使用哪个版本的WebApi/MVC框架,以便我们更好地帮助您。WebApi已经经历了许多变化,这可能会对此问题产生影响。 - Mahmoud Ali
Web API控制器(v2.1), .NET 4.5,ASP.NET MVC运行时版本4.0 - john doe
你从哪里调用 RegisterRoutes(..) 函数? - janhartmann
RegisterRoutes 是从 Global.asax 文件中调用的。这是默认实现,我没有更改它。 - john doe
据我所知,除非控制器具有名为Index的操作并且带有默认值,否则您需要指定操作。 - Nipuna
显示剩余2条评论
4个回答

15

我遇到了类似的问题,于是我决定从这个网站下载示例代码并进行对比。最终,我通过在Global.asax.cs文件中切换路由注册函数调用的顺序来解决了我的问题。

改为:

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

首先调用WebApiConfig.RegisterRoutes,即:

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

我还在调查原因。但希望这能有所帮助。


我曾遇到类似的问题,后来通过改变顺序解决了。谢谢! - Vikram

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
当您在RouteConfig.cs中设置路由时,您需要寻找MVC控制器。您应该将API路由移动到App_Data/WebApiConfig.cs。 RouteConfig: 当您在RouteConfig.cs中设置路由时,您需要寻找MVC控制器。您应该将API路由移动到App_Data/WebApiConfig.cs。
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 }
    );
});

我无法手动向App_Data文件夹添加任何文件。目前该文件夹为空。 - john doe
尝试按照我上面发布的方式向API控制器添加自己的路由。这将为您提供超出标准GET POST PUT约定的更大灵活性。 - cheesesharp
我该如何将HttpConfiguration参数传递给RegisterRoutes方法? - john doe
只要你从Global.asax.cs中调用它,它的位置并不重要,我会更新答案。 - frich
我要传递什么到WebApiConfig.RegisterRoutes(这里传递什么); - john doe
显示剩余11条评论

-1

您的API路由没有定义操作,路由引擎无法将您带到那里:

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

此路由未定义操作或默认值。路由引擎将带您到控制器,但没有动作(方法)可映射。

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

除非您将应用程序映射到IIS或类似的"MyProjects",否则您将遇到与上述相同的问题。


我该如何定义我所缺失的内容? - john doe
更改路由 url: "api/{controller}/{action}/{id} 并调用 http://localhost:54907/api/flights 以查看其功能。接下来,您可以将 GetAllFlights 更改为 'Flights',以符合您期望的 API。 - Ken Brittain
与我在原始帖子中写的问题相同。该页面不存在。 - john doe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接