第一步 新建一個控制台應用程序
並添加WebApi相關引用,注意,添加之后會默認幫你添加 System.Web.Http.WebHost
的引用,不過,折並沒有什么鳥用,干掉他,然后手動添加引用 System.Web.Http.SelfHost
。
第二步 假裝我們在開發一個正常的WebApi程序
嗯,現在我們需要一個Controller了:
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Web.Http; using WebApi.SelfHosting.Demo.Models; namespace WebApi.SelfHosting.Demo.Controllers { 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 } }; /// <summary> /// [/api/products] Get a list of all products. /// </summary> /// <returns></returns> public IEnumerable<Product> GetAllProducts() { return products; } /// <summary> /// [/api/products/id] Get a product by ID. /// </summary> /// <param name="id"></param> /// <returns></returns> public Product GetProductById(int id) { var product = products.FirstOrDefault((p) => p.Id == id); if (product == null) { throw new HttpResponseException(HttpStatusCode.NotFound); } return product; } /// <summary> /// [/api/products/?category=category] Get a list of products by category. /// </summary> /// <param name="category"></param> /// <returns></returns> public IEnumerable<Product> GetProductsByCategory(string category) { return products.Where(p => string.Equals(p.Category, category, StringComparison.OrdinalIgnoreCase)); } } }
嗯, Product
類在這里:
namespace WebApi.SelfHosting.Demo.Models { public class Product { public int Id { get; set; } public string Name { get; set; } public string Category { get; set; } public decimal Price { get; set; } } }
第三步 注冊路由
嗯。。。繼續假裝在寫一個正常的 WebApi
...
可是,人家是在Global里面注冊路由的啊,咱們這玩意沒有Global啊!沒關系,咱們有Main函數啊,都是程序入口,應該差不多,呵呵。。。
using System; using System.Web.Http; using System.Web.Http.SelfHost; namespace WebApi.SelfHosting.Demo { 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("Server Listening at 8080..."); Console.WriteLine("Press Enter to quit."); Console.ReadLine(); } } } }
注意:
- 基於WebHost的WebApi的路由是注冊到
HttpConfiguration
里的,但是基於SelfHost的卻是注冊到HttpSelfHostConfiguration
: 看吧,很明顯,多了個SelfHost - 基於WebHost的WebApi一般使用IIS作為服務器,但是SelfHost,自托管,顧名思義,需要自己實現一個服務器,有點Nodejs的意思。
第四步 搞定,打開瀏覽器看看效果吧
補充: 有人表示編譯的時候會報下面的異常:
類型“System.Web.Http.SelfHost.HttpSelfHostConfiguration”違反了繼承安全性規則。派生類型必須與基類型的安全可訪問性匹配或者比基類型的安全可訪問性低。
搜索引擎給出的解決方法是修改 AssemblyInfo.cs
文件,手動指定程序集的透明級別。
其實並不是:多半是因為你引用的 System.Web.Http.SelfHost
程序集與你添加的WebApi版本不符造成的