Asp.Net Web API 2第九課——自承載Web API

前言html

閱讀本文以前,您也能夠到Asp.Net Web API 2 系列導航進行查看 http://www.cnblogs.com/aehyok/p/3446289.htmlweb

Asp.Net Web API能夠須要IIS。你能夠在你本身的主機上來承載一個Web API。api

本教程來展現在控制檯應用程序中來承載一個Web API。使用的開發工具爲VS2013。asp.net

本文示例代碼下載連接http://pan.baidu.com/s/1d56zf異步

建立一個控制檯應用程序工具

 

這裏我默認的Framework版本爲4.5的。而後經過Nuget來下載安裝Microsoft.AspNet.WebApi.SelfHost。開發工具

建立Model和Controller測試

 首先添加一個public公共類Product。ui

    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Category { get; set; }
        public decimal Price { get; set; }
    }

而後添加一個public公共類ProductsController,而且這個類繼承自System.Web.Http.ApiController。記得添加擴展引用System.Web.Httpurl

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Web.Http;

namespace SelfHost
{
    public class ProductsController:ApiController
    {
        Product[] products = new Product[]  
        {  
            new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },  
            new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },  
            new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }  
        };
        public IEnumerable<Product> GetAllProducts()
        {
            return products;
        }
        public Product GetProductById(int id)
        {
            var product = products.FirstOrDefault((p) => p.Id == id);
            if (product == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
            return product;
        }
        public IEnumerable<Product> GetProductsByCategory(string category)
        {
            return products.Where(p => string.Equals(p.Category, category,
                    StringComparison.OrdinalIgnoreCase));
        }
    }
}

這個控制器定義了三個Get方法:

承載Web API

 打開Program.cs,而後添加以下使用語句:

using System.Web.Http;
using System.Web.Http.SelfHost; 

固然若是你沒有引用,仍是先要添加引用的(另外還有System.Net.Http)。而後添加以下代碼到Program.cs裏:

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

如今你能夠運行控制檯程序了。

如今能夠經過URI來簡單測試Web API的正確性。

(可選的)添加一個HTTP URL命名空間保留(沒遇到這個問題,暫未測試)

 這個應用程序偵聽到"http://localhost:8080"。在默認狀況下,偵聽一個特殊的HTTP URL是須要管理員權限的。當你運行上面的控制檯應用程序的時候,你可能會獲得這樣的一個錯誤:"HTTP could not register URL http://+:8080",這兒有兩種方式去避免這個錯誤:

  1.以管理員身份運行Visual Studio。

  2.使用Netsh.exe給與你的帳號權限去保留這個URL。

若要使用Netsh.exe,以管理員身份打開命令提示框,並鍵入如下命令:

netsh http add urlacl url=http://+:8080/ user=machine\username

其中machine\username是您的用戶賬戶。

當你使用完自託管的時候,最好是肯定刪除這個保留的URL。

netsh http delete urlacl url=http://+:8080/

經過客戶端應用程序來調用Web API

讓咱們來寫一個簡單的控制檯應用程序來調用Web API。

添加一個控制檯應用程序,並命名爲"ClientApp"。

一樣的經過Nuget來添加Microsoft.AspNet.WebApi.Client。

 

固然還須要應用SelfHost這個項目。

打開ClientApp項目的Program.cs文件,添加以下using語句

using System.Net.Http; 

添加一個靜態的HttpClient實例:

namespace ClientApp
{
    class Program
    {
        static HttpClient client = new HttpClient();
        static void Main(string[] args)
        {
        }
    }
}

添加三個方法 得到全部產品列表信息,經過ID得到指定產品信息,經過目錄得到產品列表信息。

static void ListAllProducts()
{
    HttpResponseMessage resp = client.GetAsync("api/products").Result;
    resp.EnsureSuccessStatusCode();

    var products = resp.Content.ReadAsAsync<IEnumerable<SelfHost.Product>>().Result;
    foreach (var p in products)
    {
        Console.WriteLine("{0} {1} {2} ({3})", p.Id, p.Name, p.Price, p.Category);
    }
}

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

    var product = resp.Content.ReadAsAsync<SelfHost.Product>().Result;
    Console.WriteLine("ID {0}: {1}", id, product.Name);
}

static void ListProducts(string category)
{
    Console.WriteLine("Products in '{0}':", category);

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

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

    var products = resp.Content.ReadAsAsync<IEnumerable<SelfHost.Product>>().Result;
    foreach (var product in products)
    {
        Console.WriteLine(product.Name);
    }
}

每一個方法遵循相同的模式:

  1.調用HttpClient.GetAsync來發送一個HTTP Get請求到適當的URI。

  2.調用HttpResponseMessage.EnsureSuccessStatusCode ,若是HTTP響應狀態是一個錯誤碼,那麼這個方法將拋出一個異常。

  3.調用ReadAsAsync<T> 反序列化一個來自HTTP響應的CLR類型。 這個方法是一個擴展方法,被定義在System.Net.Http.HttpContentExtensions


GetAsync ReadAsAsync 這兩個方法都是異步方法。它們經過返回Task 對象來表明異步操做。獲取Result屬性阻止線程,直到操做完成。

在調用這些方法以前, BaseAddress 上的屬性設置爲"http://localhost:8080"的 HttpClient 實例。例如:

 

static void Main(string[] args)
{
    client.BaseAddress = new Uri("http://localhost:8080");

    ListAllProducts();
    ListProduct(1);
    ListProducts("toys");

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

接下來,進行測試。設置啓動項目。

預測輸出內容,應該會輸出如下內容:

1 Tomato Soup 1.0 (Groceries)
2 Yo-yo 3.75 (Toys)
3 Hammer 16.99 (Hardware)
ID 1: Tomato Soup
Products in 'toys':
Yo-yo
Press Enter to quit.

運行程序,查看結果

總結

感受仍是比較簡單的吧,就這樣一步一步的下來仍是沒什麼阻礙的。

本文的參考連接http://www.asp.net/web-api/overview/hosting-aspnet-web-api/self-host-a-web-api

本文已同步到Web API系列導航 http://www.cnblogs.com/aehyok/p/3446289.html

本文示例代碼下載連接http://pan.baidu.com/s/1d56zf

相關文章
相關標籤/搜索