所有 ASP.NET Web API 控制器返回404

我试图让一个 API 控制器在 ASP.NET MVC 4网络应用程序中工作。然而,每个请求的结果都是 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>

如果你能帮忙,我将不胜感激,我有点失去理智了。 :)谢谢!

149226 次浏览

我有点困惑,不确定这是否是由于 HTTP 输出缓存问题。

无论如何,“突然之间,它开始正常工作”。:/所以,上面的例子在没有添加或修改任何内容的情况下工作。

看来代码只能坐着熬夜了... :)

谢谢帮忙,伙计们!

例如,我遇到的一个问题是,我的配置在 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);

只是说,这是我的问题,改变顺序是显而易见的,但有时忽视,可以造成很多挫折。

基本上有同样的问题,在我的情况下,通过加上:

<modules runAllManagedModulesForAllRequests="true" />

<system.webServer>


</system.webServer>

Web.config

我一直在研究一个类似的问题,我花了很长时间才发现这个问题。这不是这篇文章的解决方案,但是希望添加这个可以节省人们在寻找为什么他们的控制器可能出现404错误的原因时试图找到问题的时间。

基本上,我在类名的末尾拼错了“ Controller”,就这么简单!

在 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" />也可以工作,但不建议出现应有的性能问题。

检查如果您的控制器类具有[ RoutePrefix (“ some path”)]属性,那么所有控制器方法也都具有[ Route ()]属性集。

我也碰到过这个问题,有一段时间我一直摸不着头脑。

通过将调试器附加到应用程序 init,我已经解决了类似的问题。只需启动 webserver (例如,访问 localhost) ,连接到 w3wp,然后查看应用程序初始化是否正确完成。在我的情况下,有例外,控制器没有注册。

我有同样的404问题,这里没有一个投票赞成的解决方案。在我的例子中,我有一个具有自己的 web.config 的子应用程序,并且在父类的 httpModulesweb.config 部分中有一个清晰的标记。在 IIS 中,父类的所有 web.config 设置都应用于子应用程序。

<system.web>
<httpModules>
<clear/>
</httpModules>
</system.web>

解决方案是删除“ clear”标记,并可能在父节点的 web.config 中添加 Heritage itInChildApplications = “ false”。IIS 不能将配置设置应用于子应用程序。

<location path="." inheritInChildApplications="false">
<system.web>
....
<system.web>
</location>

添加以下行

GlobalConfiguration.Configure(WebApiConfig.Register);

Global.ascx.cs文件的 Application_Start()函数中。

为方法创建 Route 属性。

例子

        [Route("api/Get")]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}

你可以像这样打电话

我有同样的问题,然后我发现我有重复的 api 控制器类名在其他项目,尽管事实上,“路由前缀”和名称空间和项目名称不同,但他们仍然返回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);
}

我将在这里添加我的解决方案,因为我个人讨厌那些编辑 web.config 却不解释正在发生什么的解决方案。

对我来说,这就是 IIS 中默认的 Handler 映射是如何设置的。

  1. 打开 IIS 管理器
  2. 单击服务器的根节点(通常是服务器的名称)
  3. 打开“处理程序映射”
  4. 在右窗格的“操作”下,单击“查看有序列表”

这是处理请求的处理程序的顺序。如果您的处理程序与我的处理程序类似,则“ ExtensionlesUrlHandler-*”处理程序都位于 StaticFile 处理程序之下。这是不会起作用的,因为 StaticFile 处理程序有一个 * 通配符,甚至在到达无扩展控制器之前就会返回一个404。

因此,重新安排这个,并将“ Extensionless UrlHandler-*”移动到 TRACE、 OPTION 和 StaticFile 的通配符处理程序上方,然后将首先激活无扩展处理程序,并应该允许您的控制器在系统中运行的任何网站上正确响应。

注: 这基本上就是在删除并添加 web.config 中的模块时发生的情况,只是在一个地方解决了所有问题。而且不需要额外的代码!

WebApiConfig.Register(GlobalConfiguration.Configuration);

应该是 App _ start 事件中的第一个。我在 APP _ start 事件的最后一个位置尝试了它,但是没有成功。

类似的问题还有一个令人尴尬的简单解决方案——确保您的 API 方法是 public。省略任何方法访问修饰符也将返回一个 HTTP404。

将返回404:

List<CustomerInvitation> GetInvitations(){

将按预期执行:

public List<CustomerInvitation> GetInvitations(){

有这个问题。不得不取消检查 Precompile during publishing

我有几十个安装我的应用程序与不同的客户端都工作得很好,然后这一个总是返回404在所有 API 调用。事实证明,当我在 IIS 中为这个客户机创建应用程序池时,它默认为。Net Framework 2.0而不是4.0,我错过了。这导致了404错误。在我看来,这应该是一个500错误。非常具有误导性的微软!

我遇到了这个问题: 我的 WebAPI 2项目。NET 4.7.2正在按预期工作,然后我改变了项目属性,使用 Web 选项卡下的特定页面路径。当我每次运行它后,它都会给我一个404错误-它甚至没有碰到控制器。

解决方案: 我找到了。在我的 VS 解决方案文件的父目录(有时相同的目录)隐藏文件夹,并删除它。当我再次打开 VS 解决方案,清理它,并使用“重新生成”选项重新生成它时,它再次运行。VisualStudio 创建的缓存文件有问题。删除这些文件并重新构建解决方案后,将重新创建这些文件。

如果您管理 IIS,并且您必须创建新站点,那么请检查“应用程序池”,并确保必须选择 CLR 版本。在我的情况下,它被选择为“无托管代码”。在更改为 v4.0之后,它开始工作。

我在这里的评论中找到了这个: https://andrewlock.net/when-asp-net-core-cant-find-your-controller-debugging-application-parts/

在 Program.cs 中添加以下内容:

app.UseRouting();


app.UseEndpoints(endpoints =>
{
// DP: I don't know the purpose of this, but without it, all controllers report 404
endpoints.MapControllerRoute("default", "WTF is this");
});

对我来说,这是所有它采取的工作后,小时试图找到一个解决方案。如果这对你不起作用,尝试添加

builder.Services.AddControllers();