所有的ASP.NET Web API控制器都返回404
我试图让一个API控制器在ASP.NET MVC 4的Web应用程序内工作。 但是,每个请求都会导致404错误 ,我很难过。 :/
我有像这样定义的项目模板的标准API控制器路由:
public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }
在Global.asax中调用注册:
protected void Application_Start() { AreaRegistration.RegisterAllAreas(); // Register API routes WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); }
我有一个像这样的基本的API控制器:
namespace Website.Controllers { public class FavoritesController : ApiController { // GET api/<controller> public IEnumerable<string> Get() { return new [] { "first", "second" }; } // PUT api/<controller>/5 public void Put(int id) { } // DELETE api/<controller>/5 public void Delete(int id) { } } }
现在,当我浏览到本地主机:59900 / api /collections夹我希望调用Get方法,但是我得到一个404状态代码和以下响应:
<Error> <Message> No HTTP resource was found that matches the request URI 'http://localhost:59900/api/Favorites'. </Message> <MessageDetail> No type was found that matches the controller named 'Favorites'. </MessageDetail> </Error>
任何帮助将不胜感激,我在这里失去了一点点的思想。 :) 谢谢!
我遇到的一件事是我的configuration在我的GLobal.asax文件中以错误的顺序注册,例如:
正确的顺序:
AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes);
错误的顺序:
AreaRegistration.RegisterAllAreas(); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); WebApiConfig.Register(GlobalConfiguration.Configuration);
只是说,这是我的问题,改变顺序是显而易见的,但有时被忽视,可能会导致很多挫折。
基本上有同样的问题,在我的情况下解决,join:
<modules runAllManagedModulesForAllRequests="true" />
到了
<system.webServer> </system.webServer>
web.config部分
我一直在研究类似的问题,并花了很多时间才发现问题。 这不是这个post的解决scheme,但是希望添加这个可以节省一些人在寻找他们为什么可能会为他们的控制器获得一个404错误时find问题。
基本上,我在课程名称末尾拼写了“Controller”错误。 就那么简单!
添加以下行
GlobalConfiguration.Configure(WebApiConfig.Register);
在Global.ascx.cs文件的Application_Start()
函数中。
为您的方法创build一个Route属性。
例
[Route("api/Get")] public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; }
你可以调用这些http:// localhost / api / Get
我有点难住,不知道这是否是由于HTTP输出caching问题。
无论如何,“突然间它开始正常工作”。 :/所以,上面的例子工作没有我添加或更改任何东西。
猜测代码只是坐下来,一夜之间煮… 🙂
感谢您的帮助,伙计们!
把这个添加到你的web.config中的<system.webServer>
中:
<handlers> <remove name="ExtensionlessUrlHandler-Integrated-4.0"/> <remove name="OPTIONSVerbHandler"/> <remove name="TRACEVerbHandler"/> <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/> </handlers>
添加<modules runAllManagedModulesForAllRequests="true" />
也适用,但不build议应有的性能问题。
检查你的控制器类是否有[RoutePrefix(“somepath”)]属性,所有的控制器方法都有一个[Route()]属性集。
我也遇到过这个问题,一直在挠头。
我已经通过将debugging器附加到应用程序init来解决了类似的问题。 只要启动web服务器(例如,访问本地主机),附加到w3wp,看看,如果应用程序初始化完成正确。 在我的情况下,有例外,控制器没有注册。
我有同样的404问题,没有任何解决scheme在这里工作。 在我的情况下,我有一个自己的web.config子应用程序,我有一个明确的标记在父母的httpModules web.config部分。 在IIS中,所有父级的web.config设置都适用于子应用程序。
<system.web> <httpModules> <clear/> </httpModules> </system.web>
解决方法是删除“clear”标记,并可能在父级的web.config中添加inheritInChildApplications =“false”。 inheritInChildApplications用于IIS不将configuration设置应用于子应用程序。
<location path="." inheritInChildApplications="false"> <system.web> .... <system.web> </location>
我有同样的问题,然后我发现我在其他项目中重复API控制器类名称,尽pipe“routePrefix”和命名空间和项目名称是不同的,但他们仍然返回404,我改变了类名称,它工作。
由于我不清楚的原因,我宣布所有的方法/动作都是静态的 – 显然,如果你这样做,这是行不通的。 所以就把这个static
关掉
[AllowAnonymous] [Route()] public static HttpResponseMessage Get() { return new HttpResponseMessage(System.Net.HttpStatusCode.OK); }
变成了: –
[AllowAnonymous] [Route()] public HttpResponseMessage Get() { return new HttpResponseMessage(System.Net.HttpStatusCode.OK); }
我要在这里添加我的解决scheme,因为我个人讨厌编辑web.config而不解释正在发生的事情。
对我来说,它是如何在IIS中设置默认的处理程序映射。 要检查这个…
- 打开IISpipe理器
- 点击你的服务器的根节点(通常是服务器的名称)
- 打开“处理程序映射”
- 在右侧窗格的“操作”下,单击“查看有序列表”
这是处理请求的处理程序的顺序。 如果你的是我的,那么“ExtensionlessUrlHandler- *”处理程序都在StaticFile处理程序下面。 那么这是行不通的,因为StaticFile处理程序具有*的通配符,并且在到达无扩展控制器之前将返回404。
因此,重新安排这个操作,将“ExtensionlessUrlHandler- *”移动到TRACE,OPTIONS和StaticFile的通配符处理程序之上,将会首先激活Extensionless处理程序,并允许您的控制器在系统中运行的任何网站上正确响应。
注意:这基本上是当你在web.config中删除和添加模块时发生的,但是只有一个地方可以解决所有问题。 而且它不需要额外的代码!
WebApiConfig.Register(GlobalConfiguration.Configuration);
应该先在App_start事件中。 我已经在APP_start事件的最后一个位置尝试过了,但是没有奏效。
- unit testingASP.Net MVC授权属性validationredirect到login页面
- 为什么我的样式包在ASP.NET MVC 4中不能正确呈现?
- 如何重新创buildentity framework的数据库?
- 如何从ASP.Net MVC modelState获取所有错误?
- C#6.0function不适用于Visual Studio 2015
- 非静态方法需要一个目标
- 从ASP.NET MVC 5中的Facebook v2.4 API访问OAuth ExternalLoginCallback中的电子邮件地址
- 如何使用moq模拟Controller.User
- ActionLink htmlAttributes