OWIN的英文全稱是Open Web Interface for .NET。
如果僅從名稱上解析,可以得出這樣的信息:OWIN是針對.NET平台的開放Web接口。
那Web接口是誰和誰之間的接口呢?是Web應用程序與Web服務器之間的接口,OWIN就是.NET Web應用程序與Web服務器之間的接口。
為什么需要這樣一個接口呢?因為.NET Web應用程序是運行於Web服務器之中的,.NET Web應用程序需要通過Web服務器接收用戶的請求,並且通過Web服務器將響應內容發送用戶。如果沒有這樣一個接口,.NET Web應用程序就要依賴於所運行的具體Web服務器,比如ASP.NET應用程序要依賴於IIS。有了這個接口,ASP.NET應用程序只需依賴這個抽象接口,不用關心所運行的Web服務器。
所以,OWIN的作用就是通過引入一組抽象接口,解耦了.NET Web應用程序與Web服務器,再次體現了接口的重要性。在軟件開發中,每次解耦都是一次很大的進步。
【進一步的理解】
OWIN是對ASP.NET Runtime的抽象。
ASP.NET 5.0是OWIN的一種實現。
通過下面幾張圖可以更直觀地理解:
了解了一些基礎理論,下面我們來實際開發。
OWIN Self-Host ASP.NET Web API 2
首先我們創建一個空的控制台項目:
然后通過Nuget來安裝 Microsoft.AspNet.WebApi.OwinSelfHost
我們也可以打開NuGet控制台..輸入命令:Install-Package Microsoft.AspNet.WebApi.OwinSelfHost
然后我們再添加一個OWIN啟動類名為Startup 如下:
Startup中編寫代碼如下:
using Owin; using System; using System.Web.Http; namespace OwinBlog { public class Startup { public void Configuration(IAppBuilder appBuilder) { HttpConfiguration config = new HttpConfiguration(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); appBuilder.UseWebApi(config); } } }
下面我們編寫一個WebAPI的控制器,代碼如下:
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; namespace OwinBlog { public class BlogController : ApiController { // GET api/<controller> public IEnumerable<string> Get() { return new string[] { "linezero", "owin linezero blog" }; } // GET api/<controller>/5 public string Get(int id) { return string.Format("owin {0} by:linezero",id); } // POST api/<controller> public void Post([FromBody]string value) { } // PUT api/<controller>/5 public void Put(int id, [FromBody]string value) { } // DELETE api/<controller>/5 public void Delete(int id) { } } }
最后我們啟動OWIN,在Program.cs 加入以下代碼:
using Microsoft.Owin.Hosting; using System; namespace OwinBlog { class Program { static void Main(string[] args) { string baseAddress = "http://localhost:9000/"; //string baseAddress = "http://+:9000/"; //綁定所有地址,外網可以用ip訪問 需管理員權限 // 啟動 OWIN host WebApp.Start<Startup>(url: baseAddress); Console.WriteLine("程序已啟動,按任意鍵退出"); Console.ReadLine(); } } }
啟動控制台程序,然后訪問我們剛才設置的地址:
http://localhost:9000/api/blog
http://localhost:9000/api/blog/88
跨平台
通過OWIN宿主ASP.NET WebAPI還可以完美的兼容Mono 3 及以上版本。
下面我們就來看看一下運行在linux下。首先大家要安裝好 mono。
可以參考:http://www.cnblogs.com/linezero/p/4774850.html
測試系統版本:centos 6.4 mono 3.10.0
將OWIN 啟動綁定改為綁定所有地址,然后編譯。代碼如下:
using Microsoft.Owin.Hosting; using System; namespace OwinBlog { class Program { static void Main(string[] args) { string baseAddress = "http://+:9000/"; //綁定所有地址,外網可以用ip訪問 // 啟動 OWIN host WebApp.Start<Startup>(url: baseAddress); Console.WriteLine("程序已啟動,按任意鍵退出"); Console.ReadLine(); } } }
將程序上傳到linux 下,然后定位到程序目錄,通過命令啟動程序:mono OwinBlog.exe
程序已成功啟動,下面我來訪問看看: