ASP.NET MVC WebAPI 404错误

62

我有一个运行在v4.0集成模式下的asp.net web forms应用程序。

我尝试在App_Code文件夹中添加一个ApiController。

在Global.asax中,我添加了以下代码:

 RouteTable.Routes.MapHttpRoute(
      name: "DefaultApi",
      routeTemplate: "api/{controller}/{id}",
      defaults: new { id = System.Web.Http.RouteParameter.Optional }
 );
当我尝试访问控制器的地址http://localhost/api/Value时,我收到了404错误。
扩展名为空的URL在处理程序部分进行了配置。我的网站启用了表单和匿名身份验证。
扩展名为空的URL已配置为“*.”
当我访问控制器的URL时,请求由StaticHandler处理而不是ExtensionlessUrlHandler-Integrated-4.0。
我现在不知道系统为什么会抛出如下图中所示的错误。 Error

1
你确定不需要在URL中使用端口吗?比如 http://localhost:23243/api/ValueController - Valin
2
有获取方法吗?如果我没记错,它很可能也是 /api/Value - Darren Kopp
我不需要端口,因为网站已经配置在80端口上了。 - Suneel Dixit
有一个已定义的 Get。 - Suneel Dixit
2
你是否安装了MVC4和WebApi NuGet包(或DLL)?我从未尝试在Web Forms项目中使用WebApi控制器。 - Jesse Webb
显示剩余5条评论
20个回答

1
我将一个基于RouteAttribute的控制器dll复制到了bin文件夹中,但它没有被识别为有效的控制器,客户端报错404错误。
经过多次调试,我找到了问题所在。原因是控制器引用的System.Web.Http.dll版本与主项目(包含global.asax.cs的项目)引用的System.Web.Http.dll版本不同。
Asp.Net通过反射查找控制器,使用类似以下代码:
internal static bool IsControllerType(Type t)
{
    return
        t != null &&
        t.IsClass &&
        t.IsVisible &&
        !t.IsAbstract &&
        typeof(IHttpController).IsAssignableFrom(t) &&
        HasValidControllerName(t);
}

IHttpController每个版本的System.Web.Http.dll都不同,因此控制器和主要项目必须具有相同的引用。


我忘记了这个,msbuild会给出冲突的警告。 - Aldracor

1

以上的解决方案都没有解决我的问题......我的错误在于我直接将二进制文件复制到生产服务器上,然后它就无法工作了。当我将项目发布到磁盘并将“已发布”文件夹复制到服务器时,404错误消失了。这有点显而易见,但可以帮助某些人。


1

我们也遇到过这个问题,将.NET版本从4.5更改为4.5.1或更高版本即可解决该问题。


1
是的,我在4.5上有一个MVC和一个Web API,都很好。当我手动将Web API移动到MVC项目时出现了问题,MVC项目返回404错误。升级到4.5.2解决了这个问题。 - ZZZ

1
针对您正在尝试的URL(http://localhost/api/Value),请确保有一个名为ValueController的公共类型,该类型派生自ApiController,并且具有以下一些特征的公共方法:
  • 方法名称以Get开头(例如GetValues或仅Get)。
  • 方法上应用了HttpGet属性。
如果您正在尝试使用默认的Web API项目模板中的代码,则控制器的名称为ValuesController,而不是ValueController,因此URL将为http://localhost/api/values
如果以上任何方法都无法解决问题,您可以启用跟踪,这可以让您深入了解错误发生在管道的哪个部分(以及为什么)。
希望这可以帮助您。

在名为“ValuesController”的控制器中,“Values”必须与模型的名称匹配。真是浪费时间! - MTAdmin

1

在我的Application_Start()函数中,注册路由的顺序是个问题。 对我而言有效的顺序是:

AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);

之前是这样的

AreaRegistration.RegisterAllAreas();
RouteConfig.RegisterRoutes(RouteTable.Routes);
GlobalConfiguration.Configure(WebApiConfig.Register);

1
谢谢,我也遇到了同样的问题。 - Thomas Martin

0

尝试仅使用控制器名称的Value部分,像这样:

http://localhost/api/Value

注意:按照惯例,路由引擎会将传递的控制器名称后面加上单词“Controller”。通过在URI中放置“ValueController”,您让路由引擎查找名为“ValueControllerController”的类,但它没有找到。

我的错误。在帖子中我添加了控制器,但实际上我正在尝试导航到http://localhost/api/Value。 - Suneel Dixit
在发布的屏幕截图中,它说您正在尝试访问localhost/api/CustomerRegistration,是否有名为CustomerRegistrationController的控制器类? - Karl Anderson
是的,我有CustomerRegistrationController。当我尝试导航到任何WebAPI控制器时,我看到了以下截图。 - Suneel Dixit

0

现在是时候让我把自己愚蠢的疏忽添加到这里的列表中了:我错误地输入了我的WebAPI默认路由路径。

原文:

config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/id",
            defaults: new { id = RouteParameter.Optional}
        );

修正:(注意花括号“id”周围的部分)
config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional}
        );

0

你的路由配置看起来不错。请仔细检查 web.config 中的处理程序部分,对于集成模式,这是使用 ExtensionLessUrlHandler 的正确方式:

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

更多关于此主题的内容: http://blogs.msdn.com/b/tmarq/archive/2010/05/26/how-extensionless-urls-are-handled-by-asp-net-v4.aspx


0

我知道这是一个非常老的问题,但我想为未来的用户添加另一个答案。

我刚刚在一个项目中遇到了这个问题,只有在部署到CI/Staging之后才发现。解决方案是在每次将每个版本部署到每个环境时来回切换编译debug="true"值,这样它就能自己修复。


0
在我的情况下,我忘记让它从ApiController派生。因此,它看起来会像这样:
public class ValuesController : ApiController

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接