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

时间:2013-03-21 19:05:31

标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api

我正在尝试让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>

任何帮助都会非常感激,我在这里失去了一点思绪。 :)谢谢!

19 个答案:

答案 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" };
        }

您可以像http://localhost/api/Get

那样打电话

答案 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中设置默认处理程序映射的方式。要检查一下......

  1. 打开IIS管理器
  2. 单击服务器的根节点(通常是服务器的名称)
  3. 打开“处理程序映射”
  4. 在右侧窗格的“操作”下,单击“查看有序列表”
  5. 这是处理请求的处理程序的顺序。如果你的是像我的那样,那么“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后,它开始工作。