【问题标题】:How to add Web API to an existing ASP.NET MVC 4 Web Application project?如何将 Web API 添加到现有的 ASP.NET MVC 4 Web 应用程序项目?
【发布时间】:2012-08-12 23:19:51
【问题描述】:

我希望将ASP.NET Web API 添加到在 Visual Studio 2012 中开发的 ASP.NET MVC 4 Web 应用程序项目中。我必须执行哪些步骤才能将功能正常的 Web API 添加到项目中?我知道我需要一个从 ApiController 派生的控制器,但这就是我所知道的。

如果我需要提供更多详细信息,请告诉我。

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 asp.net-web-api visual-studio-2012


    【解决方案1】:

    您可以从 nuget 安装,如下图所示:

    或者,在包管理器控制台上运行以下命令行:

    Install-Package Microsoft.AspNet.WebApi
    

    【讨论】:

    • 那么,除了添加控制器,我还需要做什么呢?这就是我首先发布这个问题的原因,本教程并没有真正说明,因为它假设了一个 Web API 项目。我添加了一个 API 控制器,但它没有被路由到。
    • 本教程对于将 Web API 添加到现有项目并没有太大帮助,因此我从 Web API 项目中找到了答案,如我的回答中所述。
    • 我同意,如果您使用 Web App 项目模板,似乎已经安装了这个管道。
    • @cuongle : web api 2.2 版将与 mvc 4 一起安装?它支持 MVC 4 吗?
    【解决方案2】:

    我需要执行的步骤是:

    1. 添加对System.Web.Http.WebHost的引用。
    2. 添加App_Start\WebApiConfig.cs(参见下面的代码sn-p)。
    3. Global.asax.cs 中导入命名空间System.Web.Http
    4. MvcApplication.Application_Start()(文件Global.asax.cs)中调用WebApiConfig.Register(GlobalConfiguration.Configuration)注册默认Web应用程序路由之前,否则会优先。
    5. 添加从System.Web.Http.ApiController 派生的控制器。

    然后我可以从 the tutorial(您的第一个 ASP.NET Web API)中学到足够的知识来定义我的 API 控制器。

    App_Start\WebApiConfig.cs:

    using System.Web.Http;
    
    class WebApiConfig
    {
        public static void Register(HttpConfiguration configuration)
        {
            configuration.Routes.MapHttpRoute("API Default", "api/{controller}/{id}",
                new { id = RouteParameter.Optional });
        }
    }
    

    Global.asax.cs:

    using System.Web.Http;
    
    ...
    
    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
    
        RegisterGlobalFilters(GlobalFilters.Filters);
        WebApiConfig.Register(GlobalConfiguration.Configuration);
        RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
    

    10.16.2015 更新:

    Word 有,必须安装 NuGet 包 Microsoft.AspNet.WebApi 才能使上述工作。

    【讨论】:

    • 这真的很有帮助。我还必须添加对System.Net.Http 的引用,但除此之外,它的作用就像一个魅力!
    • 我也将一个项目从MVC3升级到4,还需要添加对System.Web.Http的引用。
    • 您现在可以使用 nuget,随时掌握发生的任何变化! nuget.org/packages/Microsoft.AspNet.WebApi
    • 直到我将我的 web api 注册更改为:GlobalConfiguration.Configure(WebApiConfig.Register);
    • @LuisGouveia 我想为时已晚,但如果这是我所拥有的,其他人可能会更快地解决它。 GlobalConfiguration.Configure(WebApiConfig.Register);在 Global.asax 之前 RouteConfig.RegisterRoutes(RouteTable.Routes);
    【解决方案3】:

    2013 年 11 月 22 日更新 - 这是最新的 WebApi 包:

    Install-Package Microsoft.AspNet.WebApi
    

    原始答案(这是一个较旧的 WebApi 包)

    Install-Package AspNetWebApi
    

    更多details.

    【讨论】:

    【解决方案4】:

    在您开始合并 MVC 和 Web API 项目之前,我建议您阅读cons and pros 以将它们分开为不同的项目。一件非常重要的事情(我自己的)是身份验证系统,这是完全不同的。

    如果您需要在 MVC 和 Web API 上使用经过身份验证的请求,您需要记住 Web API 是 RESTful(不需要保持会话、简单的 HTTP 请求等),但 MVC 不是。

    要查看实现的差异,只需在 Visual Studio 2013 中从模板创建 2 个不同的项目:一个用于 MVC,一个用于 Web API(不要忘记在创建过程中打开“个人身份验证”)。你会在 AuthencationControllers 中看到很多不同。

    所以,请注意。

    【讨论】:

      【解决方案5】:

      在控制器文件夹下添加“WebApi 控制器”后,Visual Studio 会自动处理依赖关系;

      Visual Studio 为 ASP.NET Web 添加了全套依赖项 用于项目“MyTestProject”的 API 2。

      项目中的 Global.asax.cs 文件可能需要额外的更改 启用 ASP.NET Web API。

      1. 添加以下命名空间引用:

        使用 System.Web.Http; 使用 System.Web.Routing;

      2. 如果代码尚未定义 Application_Start 方法,请添加以下方法:

        受保护的无效 Application_Start() { }

      3. 将以下行添加到 Application_Start 方法的开头:

        GlobalConfiguration.Configure(WebApiConfig.Register);

      【讨论】:

      • 这是目前实现这一目标的最简单方法。
      • 在这里不起作用。 1. Nuget:Install-Package Microsoft.AspNet.WebApi 2. 新增“Web API Controller Class (v2.1)”项。结果:添加了 api 控制器但不更改 Application_Start。与欧文。
      • 当您拥有 vs2015 - 更新 3 并添加 web api 2 控制器时,这是正确的答案。
      • 2017 年确实如此,但我不得不升级我的 WebApi 程序集。我还必须手动创建 WebApiConfig 类,docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/…
      【解决方案6】:

      在我的 MVC 5 项目中添加 WebAPI。

      1. 打开 NuGet 包管理器控制台并运行

        PM> Install-Package Microsoft.AspNet.WebApi
        
      2. 添加对 System.Web.RoutingSystem.Web.NetSystem.Net.Http dll 的引用(如果还没有)

      3. 右键控制器文件夹 > 添加新项目 > web > 添加 Web API 控制器

      4. Web.config 会被 VS 相应修改

      5. 添加Application_Start 方法(如果还没有)

        protected void Application_Start()
        {
            //this should be line #1 in this method
            GlobalConfiguration.Configure(WebApiConfig.Register);
        }
        
      6. 添加以下类(我在 global.asax.cs 文件中添加)

        public static class WebApiConfig
        {
             public static void Register(HttpConfiguration config)
             {
                 // Web API routes
                 config.MapHttpAttributeRoutes();
        
                 config.Routes.MapHttpRoute(
                     name: "DefaultApi",
                     routeTemplate: "api/{controller}/{id}",
                     defaults: new { id = RouteParameter.Optional }
                 );
             }
         }
        
      7. 相应地修改web api方法

        namespace <Your.NameSpace.Here>
        {
            public class VSController : ApiController
            {
                // GET api/<controller>   : url to use => api/vs
                public string Get()
                {
                    return "Hi from web api controller";
                }
        
                // GET api/<controller>/5   : url to use => api/vs/5
                public string Get(int id)
                {
                    return (id + 1).ToString();
                }
            }
        }
        
      8. 重建和测试

      9. 构建一个简单的html页面

        <html xmlns="http://www.w3.org/1999/xhtml">
        <head>
            <title></title>    
            <script src="../<path_to_jquery>/jquery-1.9.1.min.js"></script>
            <script type="text/javascript">
                var uri = '/api/vs';
                $(document).ready(function () {
                    $.getJSON(uri)
                    .done(function (data) {
                        alert('got: ' + data);
                    });
        
                    $.ajax({
                        url: '/api/vs/5',
                        async: true,
                        success: function (data) {
                            alert('seccess1');
                            var res = parseInt(data);
                            alert('got res=' + res);
                        }
                    });
                });
            </script>
        </head>
        <body>
        ....
        </body>
        </html>
        

      【讨论】:

      • 造成差异的一点是将 WebApiconfig.Register 放在第一行,正如@kheya 提到的那样
      • 我想补充一下,你的 api 控制器名称必须以 Controller 结尾,例如 CarController(不仅仅是 Car)!!!很多人忘记了它并获得错误消息“找不到与名为{0}'的控制器匹配的类型”
      • 为了更有效地使用这个不错的答案,您可以忽略第 4、8 和 9 步。(它们不是那么重要)如果您交换第 5 步和第 6 步的顺序,它们会更有意义(最好先创建类然后使用它,而不是使用类然后创建它)
      • 我们究竟在哪里添加对 System.Web.Routing、System.Web.Net 和 System.Net.Http 的引用?
      【解决方案7】:

      上述解决方案完美运行。我更喜欢在选择项目模板时选择Web API选项,如下图所示

      注意:该解决方案适用于 Visual Studio 2013 或更高版本。最初的问题是在 2012 年提出的,现在是 2016 年,因此添加了 Visual Studio 2013 或更高版本的解决方案。

      【讨论】:

      • 如果您正在创建一个涉及 Web API 的项目,选择 Web API 选项会更容易。该选项将创建上述回复中提到的所有必需文件。
      • 这里的问题在 Visual Studio 2012 和 mvc 4 中。虽然你的解决方案很好,但在 VS 2012 中你不能这样做
      • 这是一个很好的观点,我已经尝试了 VS 2013 的上述解决方案。感谢@netfed 指出。
      • 大家好,我的 MVC 解决方案中的 API 元素可以正常工作,但默认情况下它会尝试将解决方案作为 API 解决方案运行。但我希望它作为默认的 MVC 解决方案运行,然后如果你转到 API 位置等,运行 API。有其他人遇到这个问题并能够解决它吗?谢谢
      • "到现有的 ASP.NET MVC 4 Web 应用程序"
      【解决方案8】:

      注意:这只是上面this answer 的缩写

      1. 打开 NuGet 包管理器控制台并运行

        PM> Install-Package Microsoft.AspNet.WebApi
        
      2. 添加对 System.Web.RoutingSystem.Web.NetSystem.Net.Http dll 的引用(如果还没有)

      3. 添加以下类

        public static class WebApiConfig
        {
             public static void Register(HttpConfiguration config)
             {
                 // Web API routes
                 config.MapHttpAttributeRoutes();
        
                 config.Routes.MapHttpRoute(
                     name: "DefaultApi",
                     routeTemplate: "api/{controller}/{id}",
                     defaults: new { id = RouteParameter.Optional }
                 );
             }
         }
        
      4. 添加Application_Start 方法(如果还没有)(在 global.asax.cs 文件中)

        protected void Application_Start()
        {
            //this should be line #1 in this method
            GlobalConfiguration.Configure(WebApiConfig.Register);
        }
        
      5. 右键控制器文件夹 > 添加新项目 > web > 添加 Web API 控制器

        namespace <Your.NameSpace.Here>
        {
            public class VSController : ApiController
            {
                // GET api/<controller>   : url to use => api/vs
                public string Get()
                {
                    return "Hi from web api controller";
                }  
            }
        }
        

      【讨论】:

      • 我们究竟在哪里添加对 System.Web.Routing、System.Web.Net 和 System.Net.Http 的引用?
      • 从“添加引用”对话框中,打开该对话框并搜索这些程序集的名称,它们很有可能已经被添加。 (但只是为了确保)
      • Application_Start 方法是否应该是 Global.asax.cs 中全局类的一部分?
      • 是的,我更新了我的答案来证明,你的笔记
      • @HakamFostok 这对我有帮助。谢谢!
      【解决方案9】:

      我有同样的问题,解决方法很简单

      右击独奏 从“Manage Nuget Package for Sulotion”安装 Microsoft.ASP.NET.WebApi

      繁荣就是这样;)

      【讨论】:

        猜你喜欢
        • 2015-07-12
        • 2014-11-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-19
        • 2013-12-30
        • 1970-01-01
        相关资源
        最近更新 更多