【问题标题】:ASP.NET MVC WebAPI 404 errorASP.NET MVC WebAPI 404 错误
【发布时间】:2014-01-04 11:41:55
【问题描述】:

我有一个在 v4.0 集成模式下运行的 asp.net 网络表单应用程序。

我尝试在 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 在处理程序部分中配置。我为网站启用了表单和匿名身份验证。

ExtensionLess url 配置为 '*.'

当我点击控制器的 url 时,请求由 StaticHandler 而不是 ExtensionlessUrlHandler-Integrated-4.0 处理。

我现在不知道为什么系统会抛出如下图所示的错误。

【问题讨论】:

  • 您确定不需要在 URL 中使用端口吗?喜欢http://localhost:23243/api/ValueController
  • 有Get方法吗?如果我没记错的话,应该也是/api/Value
  • 我不需要端口,因为网站配置在 80 端口。
  • 有一个Get定义
  • 您是否安装了 MVC4 和 WebApi NuGet 包(或 DLL)?我从未尝试在 Web 窗体项目中使用 WebApi 控制器。

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


【解决方案1】:

感谢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);
        ...
    }
    

【讨论】:

    【解决方案2】:

    注册路由的顺序是我的 Application_Start() 中的问题。 对我有用的顺序是

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

    以前是

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

    【讨论】:

    • 谢谢,我也遇到了同样的问题
    【解决方案3】:

    花了几个小时在这个问题上,我找到了解决这个问题的方法。

    这是在 RouteConfig 中注册路由的顺序。

    我们应该在默认控制器路由之前在路由表中注册 HttpRoute。应该如下。 Route Config Route table configuration

      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 }
            );
    
        }
    }
    

    【讨论】:

      【解决方案4】:

      在我的例子中,我忘了让它派生自 ApiController。

      所以它看起来像

      public class ValuesController : ApiController
      

      【讨论】:

        【解决方案5】:

        我很欣赏这是一个非常古老的问题,但我想我会为未来的用户添加另一个答案。

        我发现这种情况刚刚发生在我正在处理的项目中,只是在它被部署到 CI/Staging 之后。解决方案是在将每个版本部署到每个环境一次时来回切换编译 debug="true" 值,它会自行修复。

        【讨论】:

          【解决方案6】:

          感谢香农,效果很好 =>

          我在 Global.asax 中的订单是:

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

          而不是好的:

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

          【讨论】:

          • 讨厌指出这一点,但这与大多数人赞成的答案背道而驰。所以对于所有其他人 - 请向下滚动到帮助我和(此时)其他 96 人的答案。
          • 不知何故我改变了相反的方式。一个旧的旧应用程序在进行了一些小的更改后就退出了工作,并且真的陷入了一个循环。谢谢大家。
          【解决方案7】:

          我们也遇到了这个问题,将 .NET 版本从 4.5 更改为 4.5.1 或更高版本解决了这个问题

          【讨论】:

          • 是的,我在 4.5 上有一个 MVC 和一个 Web API,两者都很好。当我手动将 Web Web API 移动到 MVC 项目时出现问题,然后 MVC 项目为 Web API 控制器返回 404。更改为 4.5.2 解决了问题。
          【解决方案8】:

          我将基于 RouteAttribute 的控制器 dll 复制到 bin 文件夹中,但它没有被识别为有效控制器,并且我在客户端上收到 404 错误。

          经过多次调试,我发现了我的问题。这是因为控制器引用的 System.Web.Http.dll 版本与主项目(包含 global.asax.cs 的项目)引用的 System.Web.Http.dll 版本不同。

          Asp.Net 使用这样的代码通过反射找到控制器

          internal static bool IsControllerType(Type t)
          {
              return
                  t != null &&
                  t.IsClass &&
                  t.IsVisible &&
                  !t.IsAbstract &&
                  typeof(IHttpController).IsAssignableFrom(t) &&
                  HasValidControllerName(t);
          }
          

          由于IHttpController对于System.Web.Http.dll的每个版本都不同,因此控制器和主项目必须具有相同的引用。

          【讨论】:

          • 我忘记了这个,msbuild给出了冲突警告。
          【解决方案9】:

          是时候将我愚蠢的疏忽添加到此处的列表中了:我输入了错误的 webapi 默认路由路径。

          原文:

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

          修正:(注意“id”周围的花括号)

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

          【讨论】:

            【解决方案10】:

            以上解决方案都没有解决我的问题...我的错误是我将 bin 文件直接复制到生产服务器,然后,我不工作。当我将项目发布到磁盘并将“已发布”文件夹复制到服务器时,404 消失了。这有点明显,但是,可以帮助一些人。

            【讨论】:

              【解决方案11】:

              同时尝试删除整个 api bin 文件夹的内容。我的包含旧的 dll(由于大的命名空间重命名)暴露了冲突的控制器。 Visual Studio 的 Clean 功能并未删除这些 dll。

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

              【讨论】:

                【解决方案12】:

                我尝试了以上所有方法并遇到了同样的问题。原来,在 IIS 中创建的 App pool 默认为 .net 2.0。当我将其更改为 4.0 时,它又可以工作了

                【讨论】:

                  【解决方案13】:

                  我遇到了这个问题。

                  我尝试编辑我的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);
                      }
                  

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

                  【讨论】:

                  • 显然路由注册的顺序很重要。先注册 HTTP 路由,再注册 MVC。
                  • 这对我绝对有帮助。尝试其他解决方案数小时无济于事。不能只贴到最后!
                  • 天哪,谢天谢地,我查了这个问题。我一直在扯我的头发......
                  • 我希望我能给这个多于一票。为我在其他任何地方都找不到的东西节省了很多时间。
                  • 天哪!我爱你很久了。
                  【解决方案14】:

                  另外,请确保您的控制器名称以“Controller”结尾,就像在“PizzaPieController”中一样。

                  【讨论】:

                  • 荒谬但真实​​! A) 为什么会这样? B)为什么这会导致所有事情的 404?
                  【解决方案15】:

                  问题出在您的路由配置中。 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 }
                     );
                  

                  【讨论】:

                  • 还要确保在 Http 路由和 MVC 路由中没有冲突的路由,因为它会导致重大问题。删除旧路由,使整个 /api 路径仅用于 Http 路由。
                  【解决方案16】:

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

                  【讨论】:

                    【解决方案17】:

                    您的路线配置看起来不错。仔细检查 web.config 中的处理程序部分,对于集成模式,这是使用 ExtensionLessUrlHandler 的正确方法:

                    <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
                    

                    有关此主题的更多信息: http://blogs.msdn.com/b/tmarq/archive/2010/05/26/how-extensionless-urls-are-handled-by-asp-net-v4.aspx

                    【讨论】:

                      【解决方案18】:

                      确保以下事项

                      1.) 如果您的 web api 是 4.5,请确保您的 IIS 配置了 .NET 4.5 或 4.0 在 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>
                      

                      【讨论】:

                      • 我将一个 4.5 的项目转换为 4.0,第三点解决了我的路由问题。谢谢!
                      【解决方案19】:

                      对于您尝试的 URL (http://localhost/api/Value),请确保有一个名为 ValueController 的公共类型,它派生自 ApiController,并且有一个具有以下一些特征的公共方法:

                      • 方法名称以Get 开头(例如GetValues 或简单的Get)。
                      • 有一个HttpGet 属性应用于该方法。

                      如果您尝试使用默认 Web API 项目模板中的代码,控制器的名称是 ValuesController,而不是 ValueController,因此 URL 将是 http://localhost/api/values

                      如果上述方法都没有帮助,您可能需要enable tracing,这可以让您深入了解错误发生在管道中的哪个位置(以及原因)。

                      希望这会有所帮助。

                      【讨论】:

                      • +1 for "'Values' in name 'ValuesController' 必须与模型名称匹配。真是浪费时间!
                      【解决方案20】:

                      尝试只使用控制器名称的Value 部分,如下所示:

                      http://localhost/api/Value
                      

                      注意:按照惯例,路由引擎将采用作为控制器名称传递的值并在其后面附加单词Controller。通过将 ValueController 放入 URI 中,您可以让路由引擎查找名为 ValueControllerController 的类,但它没有找到。

                      【讨论】:

                      • 我的错误。在帖子中我添加了控制器,但实际上我正在尝试导航到 localhost/api/Value
                      • 在发布的屏幕截图中,它说您正在尝试访问本地主机/api/CustomerRegistration,是否有一个名为 CustomerRegistrationController 的控制器类?
                      • 是的..我确实有 CustomerRegistrationController。我附上了我尝试导航到任何 webapi 控制器时看到的屏幕截图。
                      猜你喜欢
                      • 2013-02-03
                      • 2017-05-16
                      • 2017-03-28
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2016-07-30
                      • 2012-12-08
                      • 2011-08-03
                      相关资源
                      最近更新 更多