如何将Web API添加到现有的ASP.NET MVC 4 Web应用程序项目中?


365

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

让我知道是否需要提供更多详细信息。

Answers:


455

我需要执行的步骤是:

  1. 添加对的引用System.Web.Http.WebHost
  2. 添加App_Start\WebApiConfig.cs(请参见下面的代码段)。
  3. 导入命名空间System.Web.HttpGlobal.asax.cs
  4. 注册默认的Web应用程序路由之前,请WebApiConfig.Register(GlobalConfiguration.Configuration)MvcApplication.Application_Start()(在文件中Global.asax.cs)进行调用,否则它将优先。
  5. 添加源自的控制器System.Web.Http.ApiController

然后,我可以从教程(您的第一个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);
}

2015年10月16日更新:

Word拥有它,必须安装NuGet包Microsoft.AspNet.WebApi才能使上述内容起作用。


12
这真的很有帮助。我还必须添加System.Net.Http对它的引用,但除此之外,它的作用还很吸引人!
Christofer Eliasson,2012年

5
我也将项目从MVC3升级到了4,还需要添加对System.Web.Http的引用。
Damien Sawyer 2012年

3
您现在就可以使用nuget,并且随时掌握所有发生的变化!nuget.org/packages/Microsoft.AspNet.WebApi
克里斯(Chris)

3
在将我的Web api注册更改为:GlobalConfiguration.Configure(WebApiConfig.Register);之前,我无法使用此功能。
KingOfHypocrites

3
@LuisGouveia我想这已经很晚了,但是如果这就是我的话,其他人可能会更快地解决它。GlobalConfiguration.Configure(WebApiConfig.Register); 在Global.asax中位于RouteConfig.RegisterRoutes(RouteTable.Routes)之前;
Maxim 2015年


70

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

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

    PM> Install-Package Microsoft.AspNet.WebApi
  2. 加入引用System.Web.RoutingSystem.Web.NetSystem.Net.Http如果已经不存在的DLL

  3. 右键单击controllers文件夹>添加新项> web> Add Web API controller

  4. VS将相应地修改Web.config

  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
Rajat

我想补充一点,您的api控制器名称必须以Controller结尾,例如CarController(不仅仅是Car)!如此多的人忘记了它并获得错误消息“找不到与名为{0}'的控制器匹配的类型”
1_bug

为了更有效地回答这个问题,您可以忽略步骤4、8和9(它们不是那么重要)。如果您将步骤5和6的顺序互换,它们会更有意义(最好创建一个类,然后使用它,而不使用类,然后创建它)
HakanFıstık19年

我们到底在哪里添加对System.Web.Routing,System.Web.Net和System.Net.Http的引用?
gabed123年

28

在controllers文件夹下添加“ WebApi Controller”后,Visual Studio会自动处理依赖项。

Visual Studio已将ASP.NET Web API 2的完整依赖性集添加到项目“ MyTestProject”中。

项目中的Global.asax.cs文件可能需要进行其他更改才能启用ASP.NET Web API。

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

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

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

    受保护的void Application_Start(){}

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

    GlobalConfiguration.Configure(WebApiConfig.Register);


到目前为止,这是目前最简单的方法。
亚当·斯密

1
在这里不起作用。1. Nuget:Install-Package Microsoft.AspNet.WebApi2.添加新项“ Web API控制器类(v2.1)”。结果:添加了api控制器,但未更改Application_Start。和欧文一起
Artyom,2015年

2
当您拥有vs2015时,这是正确的答案-更新3并添加Web API 2控制器。
ModChowdhury

它确实在2017年完成,但是我必须升级WebApi程序集。我还必须手动创建WebApiConfig类,docs.microsoft.com / en
约翰尼

22

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

在此处输入图片说明

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

Install-Package Microsoft.AspNet.WebApi

3
因此,除了添加控制器外,我还需要做什么?这就是为什么我首先发布此问题的原因,该教程并没有真正说明,因为它假定了一个Web API项目。我添加了一个API控制器,但未路由到该控制器。
aknuds1 2012年

1
对于向现有项目中添加Web API而言,该教程并没有太大帮助,因此,正如我的回答中所概述的那样,我从Web API项目中了解了这一点。
aknuds1 2012年

我同意,如果您使用Web App项目模板,则似乎已经安装了该管道。
隆达

@cuongle:Web api 2.2版将随mvc 4安装吗?它支持MVC 4吗?
2015年

20

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

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

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

因此,请注意。


11

注意:这只是以上答案的缩写

  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. 右键单击controllers文件夹>添加新项> web> Add Web API controller

    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的引用?
gabed123

1
在“添加引用对话框”中,打开该对话框并搜索那些程序集的名称,很有可能已经添加了它们。(但只是为了确保)
HakanFıstık19年

是否应将Application_Start方法作为Global.asax.cs中全局类的一部分?
gabed123

是的,我更新了答案以证明这一点,即您的笔记
HakanFıstık19年

1
@HakamFostok这对我有帮助。谢谢!
csichar

3

上面的解决方案完美地工作。我更喜欢在选择项目模板时选择Web API选项,如下图所示

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

显示Web API选项的项目模板


2
如果您要创建一个涉及Web API的项目,则选择Web API选项将更加容易。该选项将创建以上答复中提到的所有必需文件。
Sankar Krishnamoorthy

这里遇到的问题是Visual Studio 2012和mvc4。尽管您的解决方案很好,但您无法在VS 2012中以这种方式实现
netfed 2016年

这是一个很好的观点,我已经在VS 2013上尝试了上述解决方案。感谢@netfed指出。
Sankar Krishnamoorthy

大家好,我的MVC解决方案中使用了API元素,但默认情况下,它尝试将解决方案作为API解决方案运行。但是我希望它作为默认的MVC解决方案运行,然后如果您转到API位置等,请运行API。其他人是否遇到过此问题并能够解决?谢谢
克里斯·库珀

1

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

右键单击solotion,从“ Manage Nuget Package for Sulotion”中安装Microsoft.ASP.NET.WebApi

就是这样;)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.