【问题标题】:API 2 Controller not working in ASP.NET MVC 5API 2 控制器在 ASP.NET MVC 5 中不起作用
【发布时间】:2015-02-19 19:58:16
【问题描述】:

我不知道为什么,但是我的 api 路由不起作用?我所做的是单击添加控制器,选择带有使用 EF 操作的 Web API 2 控制器(以便它为我构建它)选择模型和上下文,然后单击添加。

WebApiConfig

public static void Register(HttpConfiguration config)
    {
        config.MapHttpAttributeRoutes();

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

产品控制器(ApiController)

public IQueryable<Product> GetProducts()
    {
        return db.Products;
    }

这意味着通过转到 /api/products 它将显示产品的 json 格式......它不会。我得到的是 404:您正在查找的资源(或其依赖项之一)可能已被删除、更改名称或暂时不可用。我也尝试过放一个断点,但它甚至没有被击中。所以我有点困惑。

我确实有自定义 Web 路由配置,我认为这可能是问题所在,但是当将它们注释掉时,仍然会发生这种情况。脚手架是不是少了什么?

感谢您的帮助

【问题讨论】:

  • 在官方示例中,他们使用IEnumerable 而不是IQueryable。也许这就是问题所在?
  • 项目创建后是否添加/创建了WebApiConfig?如果是这样,您是否记得将其添加到其他注册事件发生的 Global.asax 中?如果您在创建项目后手动尝试设置 Web API,则值得检查一下。
  • 我相信它是自动为我搭建的。我需要在 Global.asax 文件中查找什么?我有 RouteConfig.RegisterRoutes(RouteTable.Routes) 但没有专门针对 API。会不会是这个问题?
  • 排序!谢谢尼克为我指明了正确的方向。这确实与 Global.asax 文件有关。我已经用修复更新了问题
  • 不要在问题中发布解决方案,并在标题中加上“已解决”。将其作为答案发布并接受。然后修正你的标题,让它真正描述问题。

标签: asp.net-mvc asp.net-web-api


【解决方案1】:

创建一个新项目并创建一个 API 控制器后,弹出一个文本文件(我决定关闭 thinkign 我知道的更好)但是一旦关闭它就不会再次弹出。

解决方案

只需将 2 个 using 语句添加到 Global.asax

using System.Web.Routing;
using System.Web.Http;

和 GlobalConfiguration.Configure(WebApiConfig.Register); 必须先来在 Application_Start 方法下的同一文件中

protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register); // <--- this MUST be first 
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }

希望这可以帮助其他人

【讨论】:

  • 相同...我复制了该行并关闭了文件。写得很清楚,放在 Application_Start() 的开头。感谢您回答您自己的帖子。
【解决方案2】:

对 Ultigma 的回答稍加补充。在您的 global.asax.cs 中:

GlobalConfiguration.Configure(WebApiConfig.Register);

应该在此之前:

RouteConfig.RegisterRoutes(RouteTable.Routes);

原因是默认Web Api路由"api/{controller}/{action}/{id}"比MVC默认路由"{controller}/更具体{action}/{id}" 并且应该放在第一位。如果不是,对 /api/products 的请求将被视为对 Api 的 Products 方法的调用 控制器。

【讨论】:

    猜你喜欢
    • 2017-03-19
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2016-10-20
    • 1970-01-01
    • 2022-06-16
    • 2016-04-04
    • 1970-01-01
    相关资源
    最近更新 更多