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

Ted*_*erg 58 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 }
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

在Global.asax中调用注册:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    // Register API routes
    WebApiConfig.Register(GlobalConfiguration.Configuration);

    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

    RouteConfig.RegisterRoutes(RouteTable.Routes);
}
Run Code Online (Sandbox Code Playgroud)

我有一个这样的基本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)
        {

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我浏览到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>
Run Code Online (Sandbox Code Playgroud)

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

Eri*_*ard 124

我碰到的一件事是我的配置在我的GLobal.asax文件中以错误的顺序注册,例如:

正确的顺序:

AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
Run Code Online (Sandbox Code Playgroud)

顺序错误:

AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
WebApiConfig.Register(GlobalConfiguration.Configuration);
Run Code Online (Sandbox Code Playgroud)

只是说,这是我的问题,改变顺序是显而易见的,但有时被忽视,可能会引起很多挫折.

  • 经过几个小时的挣扎,找到了这个答案......非常感谢!! (4认同)
  • 我认为这个答案得到了最多的投票,因为提出这个问题的人很可能会遇到订单问题,正如我在这里展示的那样。但我认为这不是这个问题的答案。我提供它作为替代答案,因为我知道来这里的人很可能会遇到与我相同的问题。不过我很感激你的要求!哈哈 (2认同)
  • 好奇,在MVC5中,自述文件首先创建一个API控制器,在Global.asax.cs上添加`GlobalConfiguration.Configure(WebApiConfig.Register);`.我注意到你有`WebApiConfig.Register(GlobalConfiguration.Configuration);`.也许我应该阅读文档但是它会以哪种方式改变它? (2认同)
  • @SomeShinyObject 如果我们按照答案中的方式执行此操作,则必须添加 `GlobalConfiguration.Configuration.EnsureInitialized();`。我们不这样做“GlobalConfiguration.Configure(WebApiConfig.Register);”。 (2认同)

Zen*_*gix 13

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

<modules runAllManagedModulesForAllRequests="true" />
Run Code Online (Sandbox Code Playgroud)

到了

<system.webServer>

</system.webServer>
Run Code Online (Sandbox Code Playgroud)

web.config的一节

  • 我发现这对我有所帮助,但在做了更多的研究之后,我发现如果不理解它意味着你就不应该这样做.看[msdn上的这个页面](https://msdn.microsoft.com/en-us/library/cc668201.aspx),它说"如果你的网站在IIS 7上运行,如果IIS已经更新,你就不会需要将runAllManagedModulesForAllRequests设置为true.事实上,**不建议将**设置为true**".有一个[补丁可用](https://support.microsoft.com/en-us/kb/980368)将不需要此设置. (5认同)

小智 11

我一直在研究类似的问题,我花了很长时间才发现问题.这不是这个特定帖子的解决方案,但希望添加这个可以节省一些时间试图找到问题,当他们搜索为什么他们可能会为他们的控制器获得404错误.

基本上,我在课程名称的末尾拼错了"Controller".就那么简单!

  • 我们花了45分钟的时间来查找API控制器为何获取404的原因。结果文件必须以“ ... Controller.cs”结尾。您的评论使我们步入正轨。谢谢! (4认同)

小智 10

添加以下行

GlobalConfiguration.Configure(WebApiConfig.Register);
Run Code Online (Sandbox Code Playgroud)

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


Ara*_*kar 7

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


BRa*_*ass 5

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

将返回 404:

List<CustomerInvitation> GetInvitations(){
Run Code Online (Sandbox Code Playgroud)

将按预期执行:

public List<CustomerInvitation> GetInvitations(){
Run Code Online (Sandbox Code Playgroud)