webapi框架搭建-建立項目(三)-webapi owin

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/testhtml

  如上圖結果,和」建立項目(二)「中的請求地址是同樣的: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。
 
總結:
  一、引用Microsoft.Owin.dll和Owin.dll程序集,編寫owin的Startup類。
    在Startup類的Configuration函數裏寫owin 的middlewares
  二、引用Microsoft.Owin.Host.SystemWeb.dll
  三、完成
    iis接收到的請求怎麼最終進入到了咱們的owin middlewares裏,徹底交給Microsoft.Owin.Host.SystemWeb.dll去處理了。
 

owin自宿主

  owin的四大結構爲Host,Server,Middleware,Application。用自宿主的方式可徹底拋開iis。web

步驟
建立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();
            }
        }
    }
}

  

運行api

  一、將編譯的控制檯程序(MyOwinSelfHost.exe) 放入到網站的bin目錄下,注意要將控制檯程序裏的相關dll文件也拷貝到webapi項目裏
  二、雙擊MyOwinSelfHost.exe,運行控制檯程序(此時控制檯程序裏什麼都沒有,也不會自動退出的,圖就不上了)
  三、用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

參考官方文檔:服務器

步驟app

引入 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;
        }
    }
}

運行asp.net

   編譯後,無論是以iis宿主的方式仍是以自宿主的方法託管webapi網站,都能訪問TestController.cs的Get()接口方法,結果以下:
一、部署在iis下
postman訪問接口地址 (get方法):http://localhost:101/api/test
postman測試的返回結果:"this is TestController.Get()"
二、雙擊」MyOwinSelfHost.exe「,部署webapi應用
postman訪問接口地址 (get方法):http://localhost:123456/api/test
postman測試的返回結果:"this is TestController.Get()"
相關文章
相關標籤/搜索