ASP.NET MVC WebAPI 404错误

62

我有一个运行在v4.0集成模式下的asp.net web forms应用程序。

我尝试在App_Code文件夹中添加一个ApiController。

在Global.asax中,我添加了以下代码:

 RouteTable.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{id}",
      defaults: new { id = System.Web.Http.RouteParameter.Optional }
 );
当我尝试访问控制器的地址http://localhost/api/Value时,我收到了404错误。
扩展名为空的URL在处理程序部分进行了配置。我的网站启用了表单和匿名身份验证。
扩展名为空的URL已配置为“*.”
当我访问控制器的URL时,请求由StaticHandler处理而不是ExtensionlessUrlHandler-Integrated-4.0。
我现在不知道系统为什么会抛出如下图中所示的错误。 Error

1
你确定不需要在URL中使用端口吗?比如 http://localhost:23243/api/ValueController - Valin
2
有获取方法吗?如果我没记错,它很可能也是 /api/Value - Darren Kopp
我不需要端口,因为网站已经配置在80端口上了。 - Suneel Dixit
有一个已定义的 Get。 - Suneel Dixit
2
你是否安装了MVC4和WebApi NuGet包(或DLL)?我从未尝试在Web Forms项目中使用WebApi控制器。 - Jesse Webb
显示剩余5条评论
20个回答

116

我遇到了这个问题。

我尝试根据一些建议和其他地方的代码示例编辑了我的WebApiConfig.cs,有些方法可行,但是它没有解释为什么在WebApiConfig.cs完全按照MS模板WebApi项目编码时路由不起作用。

我的实际问题是,在手动添加WebApi到我的项目时,我没有按照从Global.asax中调用配置的股票顺序进行操作。

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        // This is where it "should" be
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        // The WebApi routes cannot be initialized here.
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }

我可以猜测这是为什么,但我没有进一步调查。 至少可以说这不是很直观。


10
显然,注册路由的顺序很重要。先注册HTTP路由,然后是MVC。 - FishesCycle
谢谢!我一直以为是CORS问题,但实际上是404错误。这是因为将API控制器添加到现有的MVC项目中意味着在global.asax中缺少GlobalConfiguration行。 - zanther

32

问题出在你的路由配置上。Mvc 的路由和 WebApi 的路由是不同的。

请添加对 System.Web.Http.dllSystem.Web.Http.Webhost.dllSystem.Net.Http.dll 的引用,然后按照以下方式配置你的API路由:

   GlobalConfiguration.Configuration.Routes.MapHttpRoute(
     name: "DefaultApi",
     routeTemplate: "api/{controller}/{id}",
     defaults: new { id = System.Web.Http.RouteParameter.Optional }
   );

2
同时,请确保在Http路由和MVC路由中没有冲突的路由,因为这会导致重大问题。删除旧路由并使整个/api路径仅用于Http路由。 - SlaterCodes

17

确保以下事项:

1)确保您的IIS已配置为使用.NET 4.5或4.0,如果您的Web API是4.5,请在IIS中安装4.5

在管理员特权下在命令提示符中运行此命令

C:\Windows\Microsoft.NET\Framework\v4.0.30319>aspnet_regiis.exe -i

2.) 将您的路由更改为

RouteTable.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "{controller}/{id}",
      defaults: new { id = System.Web.Http.RouteParameter.Optional }
 );

使用Demo/Get进行请求(其中demo是您的控制器名称)

如果1、2无法工作,请尝试3

3.) 在web.config文件中添加以下配置

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />

</system.webServer>

2
我正在将一个4.5项目转换为4.0,第三点解决了我的路由问题。谢谢! - Kevin Struillou

11

另外,请确保您的控制器名称以“Controller”结尾,例如“PizzaPieController”。


A) 为什么会这样呢?B) 为什么会导致404错误? - graphicdivine

7

我尝试了以上所有方法,但仍然遇到了相同的问题。最终发现,IIS创建的应用程序池默认使用 .net 2.0 版本。将其更改为 4.0 版本后,问题得以解决。


4
感谢您,Shannon,非常好用 =>
我的Global.asax文件中的顺序是:
GlobalConfiguration.Configure(WebApiConfig.Register);  
RouteConfig.RegisterRoutes(RouteTable.Routes);

而不是好的那一个:

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

不想指出这个问题,但它与大多数人同意的答案相矛盾。所以对于其他人,请向下滚动查看帮助我的答案,以及(在此时)受到96人认可的答案。 - Richard Housham
不知怎么的,我改变了完全相反的方式。一款古老的应用程序在进行了一些微小的更改后停止工作,真的让我感到困惑。谢谢大家。 - Whoever

3

尝试删除整个api bin文件夹的内容。我的文件夹里包含了旧的dll文件(由于一个大型命名空间的更名),暴露了冲突的控制器。这些dll文件没有被Visual Studio的Clean功能删除。

(然而,我发现asp.net web api在调试级别严重缺乏路由和调试信息)。


2

经过几个小时的努力,我在我的情况下找到了解决方案。

问题出在 RouteConfig 中注册路由的顺序上。

我们应该在默认控制器路由之前将 HttpRoute 注册到路由表中。应如下所示:Route Config 路由表配置

  public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.MapHttpRoute(
             name: "DefaultApi",
             routeTemplate: "api/{controller}/{action}/{id}",
             defaults: new { id = RouteParameter.Optional }
         );
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

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

    }
}

2
如果您在App_Code中创建控制器,路由表如何知道其位置?您已经指定了路由为“api/{controller/...}”,但这并不是控制器的实际位置。请尝试将其移动到正确的文件夹中。

2

感谢ShannonceinpapShri Guru,以下修改对我有效:

  1. WebApiConfig.cs:

    public static void Register(HttpConfiguration config)
    {
        ...
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
    
  2. Global.asax.cs:

    protected void Application_Start()
    {
        ...
        GlobalConfiguration.Configure(WebApiConfig.Register);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        ...
    }
    

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