ASP.NET MVC WebAPI 404错误

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

我试图在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错误。

在处理程序部分中configuration无扩展url。 我有网站的表格和匿​​名身份validation启用。

ExtensionLessurlconfiguration为“*”。

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

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

我遇到了这个问题。

我尝试编辑我的WebApiConfig.cs以满足这里的一些build议,并在其他地方的代码示例。 有些工作,但没有解释为什么当WebApiConfig.cs完全按照MS模板WebApi项目编码时,路由不工作。

我的实际问题是,在手动添加WebApi到我的项目中,我没有遵循从Global.asaxconfiguration调用的股票订单

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

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

问题在于你的路由configuration。 Mvc路由不同于WebApi路由。

添加对System.Web.Http.dllSystem.Web.Http.Webhost.dllSystem.Net.Http.dll引用,然后configuration您的API路由,如下所示:

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

确保以下事情

1.)确保你的IISconfiguration了.NET 4.5或4.0,如果你的web api是4.5在IIS中安装4.5的话

在具有pipe理员权限的命令提示符下运行此命令

 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文件中添加以下configuration

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

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

我尝试了以上所有,并有同样的问题。 事实certificate,在IIS中创build的应用程序池默认为.net 2.0。 当我将其更改为4.0时,它再次工作

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

谢谢香农,伟大的工作=>

我的Global.asax中的订单是:

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

而不是好的一个:

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

对于您尝试的URL( http://localhost/api/Value ),请确保存在一个名为ValueController的公共types,该types从ApiController派生,并具有包含以下特性的公共方法:

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

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

如果非上述的帮助,你可能想要启用跟踪 ,这可以给你一个有用的洞察在哪里在错误发生(以及为什么)的stream水线。

希望这可以帮助。

也尝试删除您的整个API bin文件夹的内容。 我的包含老dll(由于一个大的命名空间重命名)暴露相冲突的控制器。 这些DLL不会被Visual Studio的Cleanfunction删除。

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

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

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

 http://localhost/api/Value 

注意:按照惯例,路由引擎会将一个传递的值作为控制器名称,并将Controller追加到它。 通过在URI中放入ValueController ,你可以让路由引擎寻找一个名为ValueControllerController的类,它没有find。

您的路线configuration看起来不错。 仔细检查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

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

现在是我把这个愚蠢的疏忽添加到列表中的时候了:我打错了我的webapi默认路由path。

原版的:

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

我复制了一个基于RouteAttribute的控制器DLL到bin文件夹中,但它没有被认为是一个有效的控制器,我得到了客户端上的404错误。

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

Asp.Net使用这样的代码通过reflectionfind控制器

 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每个版本都不同,因此控制器和主项目必须具有相同的参考。

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

我发现这只是在我部署到CI / Staging之后才开始工作的一个项目。 解决scheme是将编译debug =“true”值来回切换,同时将每个版本部署到每个环境一次,它会为我自己修复。

在我的情况下,我忘了把它从ApiController派生。

所以它看起来像

 public class ValuesController : ApiController 

花了几个小时的时间,我发现这个解决scheme在我的情况。

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

我们应该在Default路由之前的Route表中注册HttpRoute。 应该如下。 路由configuration路由表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 } ); } }