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