OWIN初探
什么是 OWIN ?
OWIN 的全稱是 "Open Web Interface for .NET", OWIN 在 .NET Web 服務器和 .NET Web 應用之間定義了一套標準的接口, 其目的是為了實現服務器與應用之間的解耦, 鼓勵為 .NET Web 應用開發簡單模塊。
OWIN 是一個開源開放的標準, 有助于建設 .NET 開發的開源生態環境,OWIN 定義了如下幾個概念:
-
服務器 (Server)
HTTP 服務器直接與客戶端交互, 并用 OWIN 語義處理請求,服務器需要一個適配層將客戶請求轉換 成 OWIN 語義。 支持 OWIN 的服務器有 Katana 和 Nowin 。
-
Web 框架 (Web Framework)
構建在 OWIN 之上的自包含的獨立組件, 向 Web 應用提供可用的對象模型或者接口。 Web 框架可 能需要一個適配層來轉換 OWIN 語義。 支持 OWIN 的 Web 框架有:
-
Web 應用 (Web Application)
一個特定的 Web 應用, 通常構建在 Web 框架之上, 使用 OWIN 兼容的服務器運行。
-
中間件 (Middleware)
特定目的的服務器和應用之間的可插拔組件, 可以監視、 路由、 修改請求與響應。
-
宿主 (Host)
應用與服務器所在的進程, 主要負責應用的啟動, 有些服務器自身也是宿主, 比如 Nowin 。
為什么使用 OWIN
正如上面所說, OWIN 定義了 .NET Web 服務器與 .NET Web 應用之間的標準接口, 將應用與服務器 解耦, 使得便攜式 .NET Web 應用以及跨平臺的愿望成為現實, 標準的 OWIN 應用可以在任何 OWIN 兼容的服務器上運行, 不再依賴與 Windows 和 IIS 。
怎么使用 OWIN
OWIN 通過 NuGet 包的形式發布, 獲取和使用都非常方便。 下面就先建立一個最簡單的 OWIN 應用:
-
打開 Xamarin Studio, 新建一個 C# 命令行程序, 如下圖所示:
-
然后打開項目屬性, 確認目標框架設置為
Mono/.NET 4.5
, 如下圖所示: -
向項目中添加如下幾個 NuGet 包:
- Owin
- Microsoft.Owin
- Microsoft.Owin.Hosting
- Microsoft.Owin.Host.HttpListener
-
添加一個 OWIN Startup 類, 代碼如下:
public class Startup { public void Configuration(IAppBuilder appBuilder) { appBuilder.Run(HandleRequest); } static Task HandleRequest(IOwinContext context) { context.Response.ContentType = "text/plain"; return context.Response.WriteAsync("Hello, world!"); } }
OWIN 約定的處理請求的代理類型是:
Func<IOWinContext, Task> handler
對應上面 Startup 類的 HandleRequest 方法, 所以上面的 Startup 類就定義了一個最簡單的 OWIN 應用, 向客戶端輸出 Hello, World!
-
在自動生成的 Program.cs 文件中的 Main 方法中添加如下代碼, 來啟動 OWIN 應用:
class MainClass { public static void Main(string[] args) { var url = "http://localhost:8080/"; var startOpts = new StartOptions(url) { }; using (WebApp.Start<Startup>(startOpts)) { Console.WriteLine("Server run at " + url + " , press Enter to exit."); Console.ReadLine(); } } }
-
現在開始運行程序, 命令行顯示如下:
打開瀏覽器, 訪問 http://localhost:8080/ , 得到的響應如下:
到目前為止, 沒有 Windows , 更沒有 IIS , OWIN 應用就能正常運行了。