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

Posted

技术标签:

【中文标题】所有 ASP.NET Web API 控制器都返回 404【英文标题】:All ASP.NET Web API controllers return 404 【发布时间】:2013-03-11 11:09:46 【问题描述】:

我正在尝试让 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 时,我希望调用 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>

任何帮助将不胜感激,我在这里有点失去理智。 :) 谢谢!

【问题讨论】:

您是否尝试过使用 Phil Haack 的 Route Tester 测试您的路线? haacked.com/archive/2008/03/13/url-routing-debugger.aspx 路由测试器说 /api/Favorites 请求匹配 api/controller/id 路由模式。但是,还有其他外部路由匹配列表中的较高位置。也许那些路线正在拦截我的请求...... 清除了所有其他路由,结果还是一样。 :( 为什么要覆盖 Application_Start?默认情况下,该方法将注册您在覆盖方法中拥有的内容。可能是两次注册的路由导致了问题。 我有一个要继承的抽象基类。我试过跳过继承,但结果保持不变。不过感谢您的帮助!我将编辑问题以消除任何混乱。 :) 【参考方案1】:

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

无论如何,“突然间它开始正常工作了”。 :/ 所以,上面的例子没有我添加或改变任何东西。

猜代码只需要坐下来煮一夜……:)

谢谢你们的帮助,伙计们!

【讨论】:

这听起来像“Build --> Clean”+“Build --> Rebuild”(顺便说一句,Rebuild 比 Clean+Build 做的少,Clean 在临时 asp.net 文件清理方面做得更多)跨度> @JonDavis 经过几个小时的挫折......你的评论帮助了我。我正在使用的项目过去已重命名,但文件夹中仍然有旧的 dll。 Build clean 不会清除它们,但是在我手动删除它们之后它现在可以工作了。【参考方案2】:

我遇到的一件事是在我的 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);

只是说,这是我的问题,更改顺序是显而易见的,但有时会被忽视,可能会导致很多挫败感。

【讨论】:

挣扎了几个小时后,找到了这个答案……非常感谢!! 我认为这个答案的投票率最高,因为提出这个问题的人很可能对订单有问题,正如我在这里展示的那样。但我认为这不是这个问题的答案。我提供了它作为替代答案,因为我知道来这里的人很可能会遇到与我相同的问题。不过我很感激你的要求!大声笑 是因为RouteConfig的路由更通用,猛击WebApiConfig的路由? 只是好奇,在 MVC5 中,自述文件状态是在首次创建 API 控制器以添加到 Global.asax.cs 上的 GlobalConfiguration.Configure(WebApiConfig.Register); 之后。我在这里注意到你有WebApiConfig.Register(GlobalConfiguration.Configuration);。也许我应该只阅读文档,但你这样做会有所不同吗? @SomeShinyObject 如果我们在答案中这样做,我们必须添加GlobalConfiguration.Configuration.EnsureInitialized();。像GlobalConfiguration.Configure(WebApiConfig.Register); 那样做我们不这样做。【参考方案3】:

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

<modules runAllManagedModulesForAllRequests="true" />

<system.webServer>

</system.webServer>

web.config部分

【讨论】:

我发现这对我有帮助,但在做了更多研究后,我发现你不应该在不了解它的含义的情况下启用它。查看this page on msdn 它说“如果您的网站在 IIS 7 上运行并且 IIS 已更新,则无需将 runAllManagedModulesForAllRequests 设置为 true。事实上,不建议将其设置为 true ”。有一个patch available 将使此设置变得不必要。【参考方案4】:

我一直在研究与此类似的问题,我花了很长时间才找到问题。这不是这个特定帖子的解决方案,但希望添加它可以节省一些时间来尝试找到问题,因为他们正在搜索为什么他们的控制器可能会收到 404 错误。

基本上,我在班级名称末尾拼错了“Controller”。就这么简单!

【讨论】:

我们花了 45 分钟试图找出 API 控制器为什么会出现 404。结果文件必须以“...Controller.cs”结尾。你的评论让我们走上了正轨。谢谢! 非常感谢,在许多项目中使用 API,无法弄清楚为什么在一切设置正确后这不起作用,阅读您的帖子并检查,忘记添加“控制器” 。如此令人沮丧的小学生错误。谢谢。【参考方案5】:

将此添加到您的 web.config 中的 &lt;system.webServer&gt;

<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>

添加&lt;modules runAllManagedModulesForAllRequests="true" /&gt; 也可以,但由于性能问题不建议使用。

【讨论】:

【参考方案6】:

检查你的控制器类是否有 [RoutePrefix("somepath")] 属性,所有控制器方法也有一个 [Route()] 属性集。

我也遇到过这个问题,并且摸不着头脑。

【讨论】:

【参考方案7】:

我通过将调试器附加到应用程序初始化解决了类似的问题。只需启动网络服务器(例如,访问 localhost),附加到 w3wp 并查看应用程序初始化是否正确完成。在我的情况下,出现了异常,并且控制器没有注册。

【讨论】:

【参考方案8】:

我遇到了同样的 404 问题,但这里没有一个被赞成的解决方案。就我而言,我有一个带有自己的 web.config 的子应用程序,并且在父级的 httpModules web.config 部分中有一个清晰的标签。在 IIS 中,所有父级的 web.config 设置都适用于子应用程序。

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

解决方案是删除“清除”标签,并可能在父级的 web.config 中添加 inheritInChildApplications="false"。 inheritInChildApplications 是为了让 IIS 不将配置设置应用于子应用程序。

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

【讨论】:

【参考方案9】:

添加以下行

GlobalConfiguration.Configure(WebApiConfig.Register);

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

【讨论】:

如果此代码回答了问题,请考虑在您的答案中添加一些解释代码的文本。这样一来,您就更有可能获得更多支持,并帮助提问者学习新知识。 这个解决方案对我来说适用于 WebApi 2.0,但是接受的答案中的“WebApiConfig.Register(GlobalConfiguration.Configuration)”引发了异常。 WebApiConfig.Register(GlobalConfiguration.Configuration) 和你的答案有什么区别?为什么刚创建项目时没有在app start中添加? @BalintBako 根据您遇到的异常情况,您可能只需要在页面顶部导入命名空间:using System.Web.Http; - 我必须这样做,然后添加 WebApiConfig.Register(GlobalConfiguration.Configuration);很好。而且我必须进入 WebApiConfig 类并将命名空间设置为没有.App_Start,这样 Global.asax.cs 就不必将using MyProject.App_Start; 添加到页面顶部。【参考方案10】:

为您的方法创建一个 Route 属性。

例子

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

你可以像这样打电话http://localhost/api/Get

【讨论】:

路由应该在 WebApiConfig 中自动处理。只有在偏离那里注册的模式时才需要这样做。【参考方案11】:

我遇到了同样的问题,然后我发现我在其他项目中有重复的 api 控制器类名称,尽管 "routePrefix" 和命名空间和项目名称不同,但它们仍然存在返回 404,我更改了类名并且它起作用了。

【讨论】:

我很高兴读到这篇文章。我也把所有东西都分开了,但它返回 404。更改控制器的名称修复了它。【参考方案12】:

由于我不清楚的原因,我已将我的所有方法/操作声明为静态 - 显然,如果您这样做,它将不起作用。所以把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);

【讨论】:

【参考方案13】:

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

对我来说,这是在 IIS 中设置默认处理程序映射的方式。要检查这个...

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

这是处理请求的处理程序的顺序。如果你的和我的一样,“ExtensionlessUrlHandler-*”处理程序都在 StaticFile 处理程序之下。那是行不通的,因为 StaticFile 处理程序有一个通配符 * 并且会在到达无扩展控制器之前返回 404。

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

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

【讨论】:

【参考方案14】:
WebApiConfig.Register(GlobalConfiguration.Configuration);

应该在 App_start 事件中排在第一位。我已经在 APP_start 事件的最后位置尝试过,但没有成功。

【讨论】:

这与接受的答案基本相同,但错误,因为它不必是第一个,只是在 RouteConfig 注册之前,因为如果你用路由调用你的 API,你就是使用ApiController,它将假定您实际上是在尝试使用您在RouteConfig 中为Controller 注册的任何内容进行路由。我不会投反对票,因为如果有人真的这样做,它会起作用,但推理不正确。【参考方案15】:

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

将返回 404:

List<CustomerInvitation> GetInvitations()

将按预期执行:

public List<CustomerInvitation> GetInvitations()

【讨论】:

谢谢@BRass .. 看到你的回答后我觉得自己很愚蠢:)【参考方案16】:

有这个问题。必须取消选中 Precompile during publishing

【讨论】:

这也是我的问题。 Tnx。【参考方案17】:

我的应用程序安装了几十个不同的客户端,它们都运行良好,然后这个在所有 api 调用上总是返回 404。事实证明,当我在 IIS 中为此客户端创建应用程序池时,它默认为 .net framework 2.0 而不是 4.0,我错过了它。这导致了 404 错误。在我看来,这应该是一个 500 错误。非常误导微软!

【讨论】:

【参考方案18】:

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

解决方案:我在我的 VS 解决方案文件的父目录(有时是同一目录)中找到了 .vs 隐藏文件夹,并将其删除。当我再次打开我的 VS 解决方案、清理它并使用 Rebuild 选项重建它时,它又运行了。 Visual Studio 创建的缓存文件存在问题。当这些被删除并重建解决方案时,文件被重新创建。

【讨论】:

【参考方案19】:

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

【讨论】:

以上是关于所有 ASP.NET Web API 控制器都返回 404的主要内容,如果未能解决你的问题,请参考以下文章