我正在尝试让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)
{
}
}
}
现在,当我浏览 localhost:59900 / api / Favorites 时,我希望调用获取方法,但我得到 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>
任何帮助都会非常感激,我在这里失去了一点思绪。 :)谢谢!
答案 0 :(得分:121)
我遇到的一件事是我的配置在我的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);
只是说,这是我的问题,改变顺序是显而易见的,但有时会被忽视,可能会引起很多挫折。
答案 1 :(得分:12)
基本上有同样的问题,在我的情况下通过添加:
解决了<modules runAllManagedModulesForAllRequests="true" />
到
<system.webServer>
</system.webServer>
web.config 的部分
答案 2 :(得分:10)
添加以下行
GlobalConfiguration.Configure(WebApiConfig.Register);
在 Global.ascx.cs 文件中的Application_Start()
函数中。
答案 3 :(得分:7)
我一直在研究类似的问题,我花了很长时间才发现问题。这不是这个特定帖子的解决方案,但希望添加这个可以节省一些时间试图找到问题,当他们搜索为什么他们可能会为他们的控制器获得404错误。
基本上,我拼写了#34; Controller&#34;我的班级名称末尾有错。就这么简单!
答案 4 :(得分:4)
我遇到了同样的问题,然后我发现我在其他项目中有重复的api控制器类名称,尽管事实上&#34; routePrefix&#34; 以及命名空间和项目名称是不同的,但他们仍然返回404,我改变了类名,它起作用了。
答案 5 :(得分:3)
为您的方法创建一个Route属性。
示例
[Route("api/Get")]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
那样打电话
答案 6 :(得分:3)
类似的问题与一个令人尴尬的简单解决方案 - 确保您的API方法是public
。离开任何方法访问修饰符也将返回HTTP 404。
将返回404:
List<CustomerInvitation> GetInvitations(){
将按预期执行:
public List<CustomerInvitation> GetInvitations(){
答案 7 :(得分:2)
我有点难过,不确定这是否是由HTTP输出缓存问题引起的。
无论如何,“突然间它开始正常运作”。 :/所以,上面的例子没有我添加或改变任何东西。
猜猜代码必须坐下来做饭一夜......:)
感谢您的帮助,伙计们!
答案 8 :(得分:1)
由于我不清楚的原因,我已经将所有的方法/操作声明为静态 - 显然,如果你这样做,它就不起作用了。所以只需关闭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);
}
答案 9 :(得分:1)
我将在这里添加我的解决方案,因为我个人讨厌那些编辑web.config而不解释发生了什么的解决方案。
对我来说,这是在IIS中设置默认处理程序映射的方式。要检查一下......
这是处理请求的处理程序的顺序。如果你的是像我的那样,那么“ExtensionlessUrlHandler- *”处理程序都在StaticFile处理程序之下。好吧,这是行不通的,因为StaticFile处理程序的通配符为*,并且在进入无扩展控制器之前将返回404。
因此,重新排列此项并将“ExtensionlessUrlHandler- *”移动到TRACE,OPTIONS和StaticFile的通配符处理程序上方,然后首先激活Extensionless处理程序,并允许您的控制器在系统中运行的任何网站中正确响应。
注意: 这基本上是当您在web.config中删除和添加模块时发生的情况,但只有一个地方可以解决所有问题。而且它不需要额外的代码!
答案 10 :(得分:0)
我有同样的404问题,这里没有一个投票的解决方案。在我的情况下,我有一个带有自己的web.config的子应用程序,我在父的httpModules web.config部分中有一个明确的标签。在IIS中,所有父级的web.config设置都适用于子应用程序。
<system.web>
<httpModules>
<clear/>
</httpModules>
</system.web>
解决方案是删除'clear'标记,并可能在父web.config中添加inheritInChildApplications =“false”。 inheritInChildApplications用于IIS不将配置设置应用于子应用程序。
<location path="." inheritInChildApplications="false">
<system.web>
....
<system.web>
</location>
答案 11 :(得分:0)
通过将调试器附加到应用程序init,我解决了类似的问题。只需启动webserver(例如,访问localhost),附加到w3wp并查看,如果应用程序初始化正确完成。在我的情况下,有例外,控制器没有注册。
答案 12 :(得分:0)
检查控制器类是否具有[RoutePrefix(&#34; somepath&#34;)]属性,所有控制器方法都设置了[Route()]属性。
我也遇到过这个问题,并且已经摸不着头脑了。
答案 13 :(得分:0)
WebApiConfig.Register(GlobalConfiguration.Configuration);
应该是App_start事件中的第一个。我已经在APP_start事件中的最后一个位置尝试过了,但是没有用。
答案 14 :(得分:0)
将此添加到您的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" />
也可以,但不建议使用性能问题。
答案 15 :(得分:0)
有这个问题。必须取消选中 Precompile during publishing
。
答案 16 :(得分:0)
我在应用程序中安装了几十个安装了不同客户端的程序,它们都运行良好,然后这个程序始终在所有api调用上返回404。事实证明,当我在IIS中为此客户端创建应用程序池时,它默认为.net framework 2.0而不是4.0,但我错过了它。这导致了404错误。在我看来,这应该是500错误。非常误导微软!
答案 17 :(得分:0)
我遇到了这个问题:.NET 4.7.2上的Web API 2项目按预期工作,然后更改了项目属性,以在“ Web”选项卡下使用“特定页面”路径。从那以后每次运行它时,它都给我一个404错误-甚至没有击中控制器。
解决方案:我在VS解决方案文件的父目录(有时是同一目录)中找到了.vs隐藏文件夹,并将其删除。当我再次打开VS解决方案,清理它并使用Rebuild选项对其进行重建时,它再次运行。 Visual Studio创建的缓存文件存在问题。删除这些文件并重建解决方案后,便会重新创建文件。
答案 18 :(得分:0)
如果您管理IIS并且必须创建新站点,则请检查“应用程序池”,并确保必须选择CLR版本。在我的情况下,已选择“无托管代码”。更改为v4.0后,它开始工作。