webapi框架搭建系列博客
上一篇:創建項目(二)
在上一篇里,我們已經創建好了webapi應用,並已經部署到iis里,本篇講如何用owin自宿主或是iis宿主來部署webapi應用。
owin介紹
傳統的asp.net網站只能部署在iis下,缺點是網站應用和服務器(即iis)耦合,這樣便導致一個簡單的請求在最終到達我們自己寫的業務代碼之前還要經過一系列iis自帶的各種modules和handlers及其它的機制(asp.net request pipeline),在我的開發經驗中就經常遇到各種iis的問題導致一個簡單的請求訪問失敗的情況。
現在的owin規范可以很好的解決這個問題,對owin的介紹和了解請參考:owin官網(
http://owin.org/)和微軟對owin規范的實現(
https://docs.microsoft.com/zh-cn/aspnet/aspnet/overview/owin-and-katana/)
以iis為宿主
步驟
引入Microsoft.Owin.Host.SystemWeb
這個包的目的是將到達iis的請求轉發到owin管道

此包只有一個程序集:Microsoft.Owin.Host.SystemWeb.dll
此包依賴於:Microsoft.Owin和Owin包
創建Startup.cs文件
代碼如下
using Microsoft.Owin; using Owin; using System.Threading.Tasks; // 標識webapiOwin.Startup類為owin的啟動類,也可寫在AssemblyInfo.cs文件里 [assembly: OwinStartup(typeof(webapi.Owin.Startup))] namespace webapi.Owin { public class Startup { /// <summary> /// owin的http請求管道配置函數 /// </summary> /// <param name="app"></param> public void Configuration(IAppBuilder app) { // 有關如何配置應用程序的詳細信息,請訪問 https://go.microsoft.com/fwlink/?LinkID=316888 app.Run(context => { context.Response.Write("這個owin管道"); return Task.FromResult(0); }); } } }
編譯后測試接口地址:http://localhost:101/api/test
如上圖結果,和”創建項目(二)“中的請求地址是一樣的:http://localhost:101/api/test,但返回的結果卻不是TestController.Get方法里的,證明request請求並沒有經過webapi,而是進入到owin的管道。
補充:
如果將網站目錄bin下的Microsoft.Owin.Host.SystemWeb.dll刪除,同樣訪問接口地址:http://localhost:101/api/test,返回的是webapi接口里的處理的結果(和創建項目(二)一樣),由此可得出結論:Microsoft.Owin.Host.SystemWeb.dll會將攔截到的iis里的請求轉到owin管道,如果沒有了此dll,請求會照舊用asp.net pipeline。


總結:
1、引用Microsoft.Owin.dll和Owin.dll程序集,編寫owin的Startup類。
在Startup類的Configuration函數里寫owin 的middlewares
2、引用Microsoft.Owin.Host.SystemWeb.dll
3、完成
iis接收到的請求怎么最終進入到了我們的owin middlewares里,完全交給Microsoft.Owin.Host.SystemWeb.dll去處理了。
owin自宿主
owin的四大結構為Host,Server,Middleware,Application。用自宿主的方式可完全拋開iis。
步驟
創建console應用

引用Microsoft.Owin.SelfHost包

注意會安裝其它的依賴包,Microsoft.Owin.Hosting,Owin,Microsoft.Owin.Diagnostics,Microsoft.Owin.Host.HttpListener,Microsoft.Owin
編寫控制台代碼
using Microsoft.Owin.Hosting; using System; namespace MyOwinSelfHost { class Program { static void Main(string[] args) { // WebApp.Start<Startup>和WebApp.Start都可以用,建議用后者,這樣通用性強。OwinHost.exe就是用這種方法 // 區別為: // 如用WebApp.Start<Startup>則要引用Startup類所在的項目 // 如用WebApp.Start,則生成的控制台程序的當前目錄下要有含[assembly: OwinStartup(xxx)]才能正常運行 //using (WebApp.Start<Startup>("http://localhost:12345")) using (WebApp.Start("http://localhost:12345")) { Console.ReadLine(); } } } }
運行
1、將編譯的控制台程序(MyOwinSelfHost.exe)
放入到網站的bin目錄下,注意要將控制台程序里的相關dll文件也拷貝到webapi項目里

2、雙擊MyOwinSelfHost.exe,運行控制台程序(此時控制台程序里什么都沒有,也不會自動退出的,圖就不上了)
3、用postman返回接口接口地址:http://localhost:123456/api/test (注意,現在已經不是iis里的網站地址了,完全是由控制台程序“新建”的一個“網站”),結果如下

當然,如果不想自己寫宿主,也可以用微軟已經寫好的owinhost.exe,請參考另一篇博客owinhost.exe用法
上面兩個標題的內容講的是如何用owin技術,當然owin技術的四大結構的細節沒有講,我的重點是梳理owin技術是如何和iis及自宿主(selfhost)交互,而owin里的其它技術細節會在后面的專題里介紹。可以看到,我們用iis宿主和自宿主(selfhost)都已經實現了一個接口類網站應用的雛形(但訪問的接口地址沒有進入webapi 的action里),下面介紹webapi如何和owin技術結合。
owin和webapi
參考官方文檔:
步驟
引入 Microsoft.AspNet.WebApi.OwinSelfHost

注意:Microsoft.AspNet.WebApi.OwinSelfHost包里本身沒有含任何dll的,nuget里只是提供了一個快捷引入webapi和owin所需所有包的快捷方式。本質上是要引用Microsoft.Owin.Hosting包,Microsoft.Owin.Host.HttpListener包,Microsoft.AspNet.WebApi.Owin包。不要被“OwinSelfHost"的名字所誤導。
在owin里加入webapi middleware
Startup.cs代碼如下
public void Configuration(IAppBuilder app) { // 有關如何配置應用程序的詳細信息,請訪問 https://go.microsoft.com/fwlink/?LinkID=316888 app.UseWebApi(WebApiConfig.OwinWebApiConfiguration(new HttpConfiguration())); }
WebApiConfig如下,只要看OwinWebApiConfiguration方法里的就行。
using System.Web.Http; namespace webapi.Configs { /// <summary> /// webapi 配置類 /// </summary> public static class WebApiConfig { /// <summary> /// 做為委托提供給System.Web.Http.GlobalConfiguration.Configuration() /// 用於webapi以iis為服務器的情況 /// </summary> /// <param name="config"></param> public static void Register(HttpConfiguration config) { // Web API 配置和服務 // Web API 路由 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } /// <summary> /// 返回webapi的httpconfiguration配置 /// 用於webapi應用於owin技術時使用 /// </summary> /// <returns></returns> public static HttpConfiguration OwinWebApiConfiguration(HttpConfiguration config) { config.MapHttpAttributeRoutes();//開啟屬性路由 config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); return config; } } }
運行
編譯后,不管是以iis宿主的方式還是以自宿主的方法托管webapi網站,都能訪問TestController.cs的Get()接口方法,結果如下:
1、部署在iis下
postman訪問接口地址 (get方法):http://localhost:101/api/test
postman測試的返回結果:"this is TestController.Get()"
2、雙擊”MyOwinSelfHost.exe“,部署webapi應用
postman訪問接口地址 (get方法):http://localhost:123456/api/test
postman測試的返回結果:"this is TestController.Get()"