将 Web API 添加到现有 MVC Web 应用程序后出现 404 错误

Posted

技术标签:

【中文标题】将 Web API 添加到现有 MVC Web 应用程序后出现 404 错误【英文标题】:404 error after adding Web API to an existing MVC Web Application 【发布时间】:2014-04-19 12:46:03 【问题描述】:

这里有个很好的问题: How to add Web API to an existing ASP.NET MVC 4 Web Application project?

不幸的是,这还不足以解决我的问题。我已经尝试了两次以确保我没有做错任何事情。我右键单击“Controllers”并添加了“Web API 2 Controller with actions, using Entity Framework”项,我在其中选择了我的模型类和数据库上下文。一切都很顺利......但仍然......每次我尝试访问 /api/Rest 时都会收到 404 错误(我的控制器的名称是 RestController)。

【问题讨论】:

参考此链接http://www.asp.net/mvc/tutorials/mvc-5/how-to-upgrade-an-aspnet-mvc-4-and-web-api-project-to-aspnet-mvc-5-and-web-api-2 @Jegadeesh,谢谢,我会检查它 @Jegadeesh,提供的链接向我解释说我应该更改 WebApiConfig.Register(GlobalConfiguration.Configuration);到 GlobalConfiguration.Configure(WebApiConfig.Register);但不幸的是,这还不够……尽管如此 您能粘贴您的 App_Start/WebApiConfig.cs 中的内容吗?你的路由资料应该在这里。 @Jegadeesh 链接已损坏。在以下位置找到类似内容:asp.net/mvc/overview/releases/… 【参考方案1】:

它的工作!我不想相信,但猜猜看,问题与 Global.asax 路由 order 有关。

虽然它不适用于:

protected void Application_Start()

    AreaRegistration.RegisterAllAreas();
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    GlobalConfiguration.Configure(WebApiConfig.Register); //I AM THE 4th
    BundleConfig.RegisterBundles(BundleTable.Bundles);
      

它适用于:

protected void Application_Start()

    AreaRegistration.RegisterAllAreas();
    GlobalConfiguration.Configure(WebApiConfig.Register); //I AM THE 2nd
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
      

疯了,我知道。

【讨论】:

api 路由必须首先评估,否则您需要创建更严格的 mvc 路由(这样框架不会尝试查找“ApiController”。)这不是 MVC5 特定的行为。跨度> 经过一番搜索,我找到了这颗宝石。快速简便的修复。谢谢! 这是正确的顺序,你必须先注册所有的 web.api 和 OData 路由,然后再注册 MVC。为什么我仍然不明白,但它可以工作。 @luis-gouveia,你认为你可以更新你的答案以反映肖恩威尔逊的观点吗?如果答案表明 Api 路由配置只需要紧接在正常 RouteConfig 之前 - 而不是两个步骤之前 - 使其工作,昨天它会为我节省 10-15 分钟。列表中#3 的 FilterConfig 不是解决方案的一部分,因此指出这一点会很有帮助。谢谢! 就我而言,我创建了Area,它被称为Api。馊主意。不管我的设置如何,继续给我 404。所以,不要创建名为 Api 的区域。【参考方案2】:

如果您想在现有的 MVC (5) 项目中使用 WebAPI,您必须执行以下步骤:1.添加 WebApi 包:

Microsoft.AspNet.WebApi
Microsoft.AspNet.WebApi.Client
Microsoft.AspNet.WebApi.Core
Microsoft.AspNet.WebApi.WebHost
Newtonsoft.Json

2.将WebApiConfig.cs文件添加到App_Start文件夹:

using System.Web.Http;

namespace WebApiTest

    public static class WebApiConfig
    
        public static void Register(HttpConfiguration config)
        
            // Web API configuration and services

            // Web API routes
            config.MapHttpAttributeRoutes();

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

3.将以下行添加到Glabal.asax

GlobalConfiguration.Configure(WebApiConfig.Register);

重要提示:你必须在AreaRegistration.RegisterAllAreas();之后添加上面的行

protected void Application_Start()

    AreaRegistration.RegisterAllAreas();
    //\\
    GlobalConfiguration.Configure(WebApiConfig.Register);
    //\\
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);

【讨论】:

【参考方案3】:

“添加新路由时请始终牢记,您必须在顶部添加特定路由,最后添加更通用的路由。否则,您的 Web 应用将永远不会收到正确的路由。”

以上是这里的引文: http://www.codeproject.com/Tips/771809/Understanding-the-Routing-Framework-in-ASP-NET-MVC

我知道答案已经给出,但这有助于理解为什么我们需要 GlobalConfiguration.Configure(WebApiConfig.Register); 前 RouteConfig.RegisterRoutes(RouteTable.Routes);

【讨论】:

以上是关于将 Web API 添加到现有 MVC Web 应用程序后出现 404 错误的主要内容,如果未能解决你的问题,请参考以下文章

JWT 不记名令牌授权应用于 .NET Core 中的现有 MVC Web 应用程序

如何将 Web API 控制器添加到现有的 ASP.NET Core MVC?

如何将自定义标头从 mvc 项目发送到 Web api 项目?

将 Angular 和 .net core web api 安全地集成到现有的 MVC 5 应用程序中

Heroku上的现有Ruby on Rails Web应用程序(PostgreSQL),Devise身份验证,需要为移动支持添加Rails API

如何在 ASP.NET MVC 5 和 WEB API 2 中实现 oauth2 服务器 [关闭]