Introduction

In this article you learn about Self-Host, how we can Self-Host the ASP.NET Web API. In this article you don't have need of the IIS server. We Host the Web API in a Console application.

Step 1

First we create the console application.

  • Start Visual Studio 2012.
  • Select "New Project" from the Start page.
  • In the Templates, select Installed template->Visual C#.
  • Select "Console application" and change name to "Hosting".
  • Click on the "OK" button.
shost.jpg

Step 2

Set the ".Net Framework 4".

  • In the "Solution Explorer" right-click on the  project.
  • Select "Properties".
  • In the "Properties windows" Select the ".Net Framework 4" From the Drop Down List of Target Folder.
shost1.jpg
  • For applying the change open a prompt and click on "Yes".

Step 3

We check that the Nuget Package Manager is installed or not.

  • Go to the Tools menu.
  • If there is a "Library Package Manager" visible then the "Nuget Package Manager" is installed.
  • If "Library Package Manager" is not visible then it is not installed.

For installation of "Nuget Package Manager":

  • Go to the "Tools" menu then select "Extension and Updates".
  • In the "Extension and Updates" dialog box select "Online".
  • In the search box Type "nuget package manager".
  • Select the "Nuget Package Manager and Install it.

Step 4

Now we install the Web API Self-Host Package.

  • Go to the "Tools" menu then select "Library Package Manager" -> "Manages Nuget Packages For Solution".
  • In the "Nuget Package Manager" dialog box type "Microsoft.AspNet.WebApi.SelfHost".
shost13.jpg
  • Select the ASP.NET Web API Self Host and click Install.
shost14.jpg
  • Click on the "I Accept" button.

Step 5

Create the Model class:

  • In the "Solution Explorer".
  • Right-click on the project then select "Hosting" -> "Add" -> "Class".
  • Change the name of class as "Item".
  • Click on the "OK" button.

Add this code in the "Item" Class:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

 

namespace Hosting

{

     public class Item

    {

        public int Id { get; set; }

        public string Name { get; set; }

        public string Category { get; set; }

    }

}

 

 

 Step 6

To add a Controller class:

  • In the "Solution Explorer".
  • Right-click on the project then select "Hosting" -> "Add" -> "Class".
  • Change the name of the class to "ItemsController".
  • Click on the "OK" button.

Add this code in the "ItemsController" class:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Text;

using System.Web.Http;

namespace Hosting

{

     public class ItemsController : ApiController

    {

     Item[] items = new Item[]  

 

        { 

            new Item { Id = 1, Name = "Apple", Category = "Fruit" }, 

            new Item{ Id = 2, Name = "Tomato", Category = "vasitable" }, 

            new Item{ Id = 3, Name = "T-Shirt", Category = "cloths"

        };

 

     public IEnumerable<Item> GetAllItems()

        {

            return items;

        }

 

     public Item GetItemById(int id)

        {

            var item = items.FirstOrDefault((i) => i.Id == id);

            if (item == null)

            {

                throw new HttpResponseException(HttpStatusCode.NotFound);

            }

            return item;

        }

 

     public IEnumerable<Item> GetItemsByCategory(string category)

        {

            return items.Where(i => string.Equals(i.Category, category,

                    StringComparison.OrdinalIgnoreCase));

        }

    }

}

 

Step 7

Now we Host our Web API.

Open the "Program.cs" file and add this code into this file:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Web.Http;

using System.Web.Http.SelfHost;

namespace Hosting

{

    class Program

    {

        static void Main(string[] args)

        {

            var config = new HttpSelfHostConfiguration("http://localhost:8080");

 

            config.Routes.MapHttpRoute(

                "API Default", "api/{controller}/{id}",

                new { id = RouteParameter.Optional });

 

            using (HttpSelfHostServer server = new HttpSelfHostServer(config))

            {

                server.OpenAsync().Wait();

                Console.WriteLine("Press Enter to quit.");

                Console.ReadLine();

            }

        }

    }

}

 

Step 8

Add a new project in this application using the following:

  • In the "Solution Explorer".
  • Right-click on project then select "Add" -> "New Project"
  • Change the name to "Client".
shost6.jpg

Step 9

Install the "Microsoft ASP.NET Web API Client Library" using the following:

  • Go to the "Tools" menu then select "Extension and Updates".
  • In the "Extension and Updates" dialog box select "Online".
  • In the search box type "Microsoft.AspNet.WebApi.Client".
  • Select the "Microsoft ASP.NET Web API library" and install it.
shost15.jpg

Step 10

Add the reference of the client to the "Hosting" project using the following:

  • In the "Solution Explorer" right-click on the "Client" project.
  • Select "Add reference".
  • Open a "Reference" dialog box.
  • Select the solution and choose "Projects".
shost8.jpg
  • Click on the "Ok" button.

Step 11

Open the "Program.cs" file in the "Client" project.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using System.Net.Http;

namespace Client

{

    class Program

    {

        static HttpClient client = new HttpClient();

        static void Main(string[] args)

        {

            client.BaseAddress = new Uri("http://localhost:8080");

 

            ListAllItems();

            ListItem(1);

            ListItems("fruit");

 

            Console.WriteLine("Press Enter to quit.");

            Console.ReadLine();

 

        }

        static void ListAllItems()

        {

            HttpResponseMessage resp = client.GetAsync("api/items").Result;

            //resp.EnsureSuccessStatusCode();

 

            var items = resp.Content.ReadAsAsync<IEnumerable<Hosting.Item>>().Result;

            foreach (var i in items)

            {

                Console.WriteLine("{0} {1} {2}", i.Id, i.Name,  i.Category);

            }

        }

 

        static void ListItem(int id)

        {

            var resp = client.GetAsync(string.Format("api/products/{0}", id)).Result;

            //resp.EnsureSuccessStatusCode();

 

            var item = resp.Content.ReadAsAsync<Hosting.Item>().Result;

            Console.WriteLine("ID {0}: {1}", id, item.Name);

        }

 

        static void ListItems(string category)

        {

            Console.WriteLine("items in '{0}':", category);

 

            string query = string.Format("api/items?category={0}", category);

 

            var resp = client.GetAsync(query).Result;

            resp.EnsureSuccessStatusCode();

 

            var items = resp.Content.ReadAsAsync<IEnumerable<Hosting.Item>>().Result;

            foreach (var item in items)

            {

                Console.WriteLine(item.Name);

            }

        }

    }

}

 

Step 12

Now execute the application.

  • In the "Solution Explorer" right-click on the "Hosting" Project.
  • And select "set as Start up project".
host12.jpg

Press F5 for execution.

shost10.jpg

Step 13

Debug the project "Hosting" using the following:

  • In the Solution Explorer" right-click on the project "Client".
  • Select "Debug"-> "Start new instance".
shost16.jpg

Output
 
shost12.jpg

 

Next Recommended Readings