使用OWIN 為WebAPI 宿主 跨平台


OWIN是什么?

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

 

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

程序已成功啟動,下面我來訪問看看:

 

 參考鏈接:

http://www.cnblogs.com/dudu/p/what-is-owin.html

http://www.cnblogs.com/shanyou/p/3650705.html

http://www.asp.net/web-api/overview/hosting-aspnet-web-api/use-owin-to-self-host-web-api

感謝dudu 站長,以及善友兄。

 

  如果你覺得本文對你有幫助,請點擊“推薦”,謝謝。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM