Common類及實體定義、Web API的定義請參見我的上一篇文章:以Web Host的方式來寄宿Web API。
一、以Self Host寄宿需要新建一個Console控制檯專案(SelfHost)
這個專案也需要引用之前定義的WebApi專案或者把WebApi.dll放到此專案的執行Bin目錄下,
另外,需要引用的DLLs如下:
- System.Web.Http.dll (C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\System.Web.Http.dll)
- System.Web.Http.WebHost.dll(C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies\System.Web.Http.WebHost.dll)
- System.Net.Http.dll(C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6\System.Net.Http.dll)
具體程式碼如下:
1 using System; 2 using System.Reflection; 3 using System.Threading.Tasks; 4 using System.Web.Http; 5 using System.Web.Http.SelfHost; 6 7 namespace SelfHost 8 { 9 internal static class Program 10 { 11 private static void Main(string[] args) 12 { 13 // 載入包含Web API的程式集 14 Assembly.Load("WebApi, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"); 15 16 // 採用BaseAddress來初始化HTTP服務的配置類 17 var configuration = new HttpSelfHostConfiguration("http://localhost/selfhost"); 18 19 // 生成直接偵聽HTTP的Server例項 20 using (var httpServer = new HttpSelfHostServer(configuration)) 21 { 22 // 註冊路由 23 httpServer.Configuration.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional }); 24 var task = httpServer.OpenAsync(); 25 if (task.Status == TaskStatus.WaitingForActivation) 26 { 27 Console.WriteLine("Http Server started!"); 28 } 29 Console.Read(); 30 } 31 } 32 } 33 }
WCF服務寄宿的時候我們必須指定寄宿服務的型別,但是對於ASP.NET Web API的寄宿來說,不論是Web Host還是Self Host我們都無須指定IHttpController的型別。也就是說,WCF服務寄宿是針對具體某個服務型別的,而ASP.NET Web API的寄宿則是批量的。ASP.NET Web API的批量寄宿源自它對HttpController型別的智慧解析,它會從程式集列表中解析出所有的HttpController型別。對於WebHost來說,它會利用BuildManager來獲得當前專案直接或者間接引用的程式集,但是對於Self Host來說,型別的解析在預設情況下只會針對載入到當前應用程式域中的程式集列表。
二、測試
把SelfHost專案設定為啟動專案,Ctrl+F5執行程式;