How to add Web API to an existing ASP.NET MVC 4 Web Application project?

227,908

Solution 1

The steps I needed to perform were:

  1. Add reference to System.Web.Http.WebHost.
  2. Add App_Start\WebApiConfig.cs (see code snippet below).
  3. Import namespace System.Web.Http in Global.asax.cs.
  4. Call WebApiConfig.Register(GlobalConfiguration.Configuration) in MvcApplication.Application_Start() (in file Global.asax.cs), before registering the default Web Application route as that would otherwise take precedence.
  5. Add a controller deriving from System.Web.Http.ApiController.

I could then learn enough from the tutorial (Your First ASP.NET Web API) to define my API controller.

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);
}

Update 10.16.2015:

Word has it, the NuGet package Microsoft.AspNet.WebApi must be installed for the above to work.

Solution 2

UPDATE 11/22/2013 - this is the latest WebApi package:

Install-Package Microsoft.AspNet.WebApi

Original answer (this is an older WebApi package)

Install-Package AspNetWebApi

More details.

Solution 3

To add WebAPI in my MVC 5 project.

  1. Open NuGet Package manager console and run

    PM> Install-Package Microsoft.AspNet.WebApi
    
  2. Add references to System.Web.Routing, System.Web.Net and System.Net.Http dlls if not there already

  3. Right click controllers folder > add new item > web > Add Web API controller

  4. Web.config will be modified accordingly by VS

  5. Add Application_Start method if not there already

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
    
  6. Add the following class (I added in global.asax.cs file)

    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. Modify web api method accordingly

    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. Rebuild and test

  9. Build a simple html page

    <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>
    

Solution 4

As soon as you add a "WebApi Controller" under controllers folder, Visual Studio takes care of dependencies automatically;

Visual Studio has added the full set of dependencies for ASP.NET Web API 2 to project 'MyTestProject'.

The Global.asax.cs file in the project may require additional changes to enable ASP.NET Web API.

  1. Add the following namespace references:

    using System.Web.Http; using System.Web.Routing;

  2. If the code does not already define an Application_Start method, add the following method:

    protected void Application_Start() { }

  3. Add the following lines to the beginning of the Application_Start method:

    GlobalConfiguration.Configure(WebApiConfig.Register);

Solution 5

You can install from nuget as the the below image:

enter image description here

Or, run the below command line on Package Manager Console:

Install-Package Microsoft.AspNet.WebApi
Share:
227,908
aknuds1
Author by

aknuds1

Pragmatic Go/Rust/JavaScript ++ software engineer Homepage GitLab LinkedIn profile

Updated on February 15, 2020

Comments

  • aknuds1
    aknuds1 over 4 years

    I wish to add an ASP.NET Web API to an ASP.NET MVC 4 Web Application project, developed in Visual Studio 2012. Which steps must I perform to add a functioning Web API to the project? I'm aware that I need a controller deriving from ApiController, but that's about all I know.

    Let me know if I need to provide more details.

  • aknuds1
    aknuds1 almost 12 years
    So, what else do I need to do except add the controller? This is why I posted this question in the first place, the tutorial doesn't really say since it assumes a Web API project. I've added an API controller, but it isn't routed to.
  • aknuds1
    aknuds1 almost 12 years
    The tutorial wasn't of much help as regards adding a Web API to an existing project, so I figured it out from a Web API project, as outlined in my answer.
  • Christofer Eliasson
    Christofer Eliasson over 11 years
    This was really helpful. I had to add a reference to System.Net.Http as well, but apart from that, it worked like a charm!
  • aknuds1
    aknuds1 over 11 years
    Cool, I just tested by creating a new MVC 4 Internet project though, and it already references System.Net.Http. So maybe your case differs slightly?
  • Christofer Eliasson
    Christofer Eliasson over 11 years
    Yeah, mine was an MVC 3 application that I had manually updated to MVC 4. Don't know if that could be the reason.
  • Damien Sawyer
    Damien Sawyer over 11 years
    I upgraded a project from MVC3 to 4 as well and also needed to add a reference to System.Web.Http.
  • makerofthings7
    makerofthings7 over 11 years
    I created an "Internet Application" and it seems that all of this is done for you out of the box.
  • longda
    longda over 11 years
    Anyone know if this will allow you to create the equivalent of a new area in the project called "api" that has it's own distinct controllers and such tucked under an api directory? Then you could have your standard web controllers for web site in the usual area and an entirely different set under api. Wow, I really hope that made sense.
  • longda
    longda over 11 years
    I agree, it seems that this plumbing is already installed if you use the Web App project template.
  • aknuds1
    aknuds1 over 11 years
    @longda The Web API route in this answer means that requests to /api/* get routed to API controllers. I don't think it matters if you put your API controllers in a sub-directory ("api"), although I've done this in my projects. Just try for yourself.
  • Chris
    Chris almost 11 years
    As of 2013 that is a legacy package and you want Install-Package Microsoft.AspNet.WebApi now. See nuget.org/packages/Microsoft.AspNet.WebApi
  • Chris
    Chris almost 11 years
    You can use nuget now, and stay on top of any changes that happen! nuget.org/packages/Microsoft.AspNet.WebApi
  • Dave Jellison
    Dave Jellison over 10 years
    @longda Although it isn't required to be in an Area "api" it plays nicer with the Html helpers - well, kinda. The helpers themselves are in need of a little help when it comes to areas imho.
  • Luis Gouveia
    Luis Gouveia about 10 years
    @aknuds1, this is one great article but I'm surely doing something wrong. I'm trying to make it work on MVC 5 with no success. I did it according to this explanation and then I right clicked on "Controllers" and added the item "Web API 2 Controller with actions, using Entity Framework" where I selected my model class and db context. Everything went fine but when I tried to access /api/(MyController)... BOOM: 404
  • aknuds1
    aknuds1 about 10 years
    @LuisGouveia Sorry I haven't tried MVC 5, maybe the routing has changed? Are you sure you're accessing the controller with the right URL? I.e., if it's named MyController, you should access it as /api/My.
  • Luis Gouveia
    Luis Gouveia about 10 years
    @aknuds1, That's exactly what I did... it must be something else... Do you think it can be related with my configuration SSL=TRUE (HTTPS)? Thanks
  • aknuds1
    aknuds1 about 10 years
    @LuisGouveia I have no idea really. My advice would be to create a new Web API 2 project, and see how that works.
  • atconway
    atconway about 10 years
    Make sure to note the "before registering the default Web Application route as that would otherwise take precedence" comment or you will get a HTTP 404 "resource not found' error even though you might have everything else actually wired up correctly.
  • KingOfHypocrites
    KingOfHypocrites almost 10 years
    I wouldn't get this to work until I changed my web api register to: GlobalConfiguration.Configure(WebApiConfig.Register);
  • CodeGrue
    CodeGrue almost 10 years
    Why is "api/{controller}/{id}" not "api/{controller}/{action}/{id}"?
  • aknuds1
    aknuds1 almost 10 years
    @CodeGrue As I recall, with Web API controllers represent (REST) resources, for example users, and actions don't fit into that scheme. For example, you could issue a GET request for /api/users/1, which means to get user 1.
  • VansFannel
    VansFannel over 9 years
    Maybe WebApiConfig.Register(GlobalConfiguration.Configuration); must be after AreaRegistration.RegisterAllAreas();.
  • Adam Smith
    Adam Smith over 9 years
    This is by far the easiest way to achieve this now.
  • Maxim
    Maxim over 9 years
    @LuisGouveia I guess it's to late but someone else will probably resolve it quicker if this is what I had. GlobalConfiguration.Configure(WebApiConfig.Register); in Global.asax goes before RouteConfig.RegisterRoutes(RouteTable.Routes);
  • Luis Gouveia
    Luis Gouveia over 9 years
    Hello Maxim, yes, I know, probably you fixed it after checking my own answer :) stackoverflow.com/questions/22401403/…
  • Artyom
    Artyom almost 9 years
    Does not work here. 1. Nuget: Install-Package Microsoft.AspNet.WebApi 2. Add new item "Web API Controller Class (v2.1)". Result: adds the api controller but does not change Application_Start. With Owin.
  • BrianLegg
    BrianLegg over 8 years
    I had to run the following "Install-Package Microsoft.AspNet.WebApi" in addition to the steps above to get this to work. Thanks
  • Shimmy Weitzhandler
    Shimmy Weitzhandler over 8 years
    Anything on authorization?
  • Dan Beaulieu
    Dan Beaulieu over 8 years
    I also needed GlobalConfiguration.Configuration.EnsureInitialized(); at the end of my global asax
  • Thomas
    Thomas over 8 years
    @cuongle : web api version 2.2 will be install with mvc 4 ? does it support MVC 4?
  • Sankar Krishnamoorthy
    Sankar Krishnamoorthy about 8 years
    If you are creating a project that involves Web API, it would be easier to choose the Web API option. The option will create all required files as mentioned in the above replies.
  • netfed
    netfed almost 8 years
    The problem at hand here is in Visual studio 2012 and mvc 4. Although your solution is just fine, you cannot do it in that way in VS 2012
  • Sankar Krishnamoorthy
    Sankar Krishnamoorthy almost 8 years
    This is a good point and I have tried above solution with VS 2013. Thanks @netfed for pointing out.
  • Jeremy Ray Brown
    Jeremy Ray Brown over 7 years
    Following the steps above worked great except for one issue. The answer to the issue I had is at: Ensure that HttpConfiguration.EnsureInitialized()
  • Chris Cooper
    Chris Cooper about 7 years
    Hi All, I've got the API element working in my MVC solution, but as default it tried to run the solution as a API solution. But I want it to run as a MVC solution as default and then if you go to the API location etc, run the APIs.. Has anyone else had this issue and been able to resolve it? Thanks
  • muratoner
    muratoner about 7 years
    Thanks was really helpfull.
  • ModChowdhury
    ModChowdhury about 7 years
    this is the right answer when you have vs2015 - update 3 and adding web api 2 controller.
  • Rajat
    Rajat over 6 years
    The point that created a difference was placing the WebApiconfig.Register in the first line, as was mentioned by @kheya
  • Aweda
    Aweda almost 6 years
    I did't find System.Web.Http.WebHost in my Add Reference window. I had to use PMC with the following command: Install-Package Microsoft.AspNet.WebApi.WebHost. Thanks for sharing this @aknuds1.
  • 1_bug
    1_bug over 5 years
    I would like to add, your api controller name have to end with Controller, like CarController (not just Car)!!! So many people forget about it and obtain error message "No type was found that matches the controller named {0}'"
  • johnny
    johnny over 5 years
    It did in 2017, but I had to upgrade my WebApi assemblies. I also had to create the WebApiConfig class manually, docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/…
  • Hakan Fıstık
    Hakan Fıstık about 5 years
    To be more efficient with this nice answer you can disregard steps 4, 8 and 9. (they are not so essential) And if you swap the order of step 5 and 6 they will make more sense (it is better to create a class then use it, instead of use the class then create it)
  • gabed123
    gabed123 about 5 years
    Where exactly are we adding references to System.Web.Routing, System.Web.Net and System.Net.Http?
  • gabed123
    gabed123 about 5 years
    Where exactly are we adding references to System.Web.Routing, System.Web.Net and System.Net.Http?
  • Hakan Fıstık
    Hakan Fıstık about 5 years
    From the Add Reference Dialog, open that dialogue and search for the names of those assemblies, there is a great chance that they are already added. (but just to make sure)
  • gabed123
    gabed123 about 5 years
    Is the Application_Start method supposed to be a part of the global class in Global.asax.cs?
  • Hakan Fıstık
    Hakan Fıstık about 5 years
    yes, I updated my answer to demonstrate that, that you for the note
  • csichar
    csichar about 5 years
    @HakamFostok This helped me. Thank you!
  • Mike W
    Mike W over 4 years
    where is RegisterGlobalFilters() defined?
  • Prince Gnakou
    Prince Gnakou over 4 years
    Thanks, really helpful. Please how do I make the web api use token based authentication while keeping the mvc part using cookie based authentication?
  • MetalGeorge
    MetalGeorge about 4 years
    BTW, I was receiving and error also, but it can be fixed by using this solution: forums.asp.net/t/…
  • Ali123
    Ali123 about 3 years
    "to an existing ASP.NET MVC 4 Web Application"