70

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

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

4

19 回答 19

139

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

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

于 2014-12-15T06:03:28.290 回答
15

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

<modules runAllManagedModulesForAllRequests="true" />

<system.webServer>

</system.webServer>

web.config部分

于 2015-02-24T03:49:33.833 回答
13

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

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

于 2015-04-16T11:49:54.827 回答
10

添加以下行

GlobalConfiguration.Configure(WebApiConfig.Register);

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

于 2016-08-27T16:52:34.467 回答
7

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

于 2016-12-01T04:16:18.087 回答
5

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

将返回 404:

List<CustomerInvitation> GetInvitations(){

将按预期执行:

public List<CustomerInvitation> GetInvitations(){
于 2017-12-04T20:34:44.467 回答
3

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

例子

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

你可以像这样调用http://localhost/api/Get

于 2016-10-14T14:52:07.837 回答
2

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

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

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

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

于 2013-03-22T08:03:27.240 回答
2

有这个问题。不得不取消选中Precompile during publishing

于 2018-06-11T07:13:56.917 回答
2

由于我不清楚的原因,我已将我的所有方法/操作声明为静态 - 显然,如果你这样做它不起作用。所以只要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);
}
于 2017-03-02T12:01:48.520 回答
1

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

我也遇到了这个问题,并且摸索了一段时间。

于 2016-03-12T22:11:05.803 回答
1
WebApiConfig.Register(GlobalConfiguration.Configuration);

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

于 2017-10-27T02:20:51.953 回答
1

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

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

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

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

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

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

于 2017-07-02T04:41:29.787 回答
0

将此添加到<system.webServer>您的 web.config 中:

<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" />也可以,但由于性能问题不建议添加。

于 2015-12-05T20:07:44.620 回答
0

If you manage the IIS and you are the one who have to create new site then check the "Application Pool" and be sure the CLR version must be selected. In my situation, it had been selected "No Managed Code". After changed to v4.0 it started to work.

于 2020-09-16T16:17:06.627 回答
0

我遇到了同样的 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>
于 2016-07-06T20:37:25.297 回答
0

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

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

于 2020-04-27T23:00:42.743 回答
0

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

于 2016-06-07T11:03:12.120 回答
0

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

于 2020-03-17T22:15:19.520 回答