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.asax
configuration调用的股票订单
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.dll
, System.Web.Http.Webhost.dll
和System.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 } ); } }