Owin介绍
什么是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的一种实现
通过下面几张图可以更直观地理解:
![](http://upload-images.jianshu.io/upload_images/4177671-b46303e4be854f84.png?imageMogr2/auto-orient/strip|imageView2/2/w/640/format/webp)
![](http://upload-images.jianshu.io/upload_images/4177671-a92e1e55b6df9705.png?imageMogr2/auto-orient/strip|imageView2/2/w/716/format/webp)
![](http://upload-images.jianshu.io/upload_images/4177671-c61aa8f8f1019d0b.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)
![](http://upload-images.jianshu.io/upload_images/4177671-65426d7d1eb0ea4f.png?imageMogr2/auto-orient/strip|imageView2/2/w/615/format/webp)
我对Owin理解
OWIN是一个规范和标准,旨在阐述web服务器和web应用应该如何去解耦,它使得原本不太可能迁移到其他环境的ASP.NET应用变得可能。
在OWIN之前,当我们在写ASP.NET应用的时候,我们的思想里是默认将我们的应用绑定到IIS上的,因为我们要依赖System.Web这个程序集。
System.Web这个程序集似乎在ASP的年代就存在着了,它包含的东西未必每个你都需要,但是每个默认每个请求都会使用这个资源,所以就可能造成一些浪费。
要明白的是OWIN本身是一个规范,它没有什么dll啊exe之类的,我理解它就是一份文档而已。
基于Owin的延伸
Katana源于微软,是微软为了实现OWIN的规范而作的产品,它就是实实在在的程序集了,我们可以使用它了。现在的Katanna实现了:
Web API
SignalR
目前ASP.NET MVC和Web Forms还是只能在System.Web中运行,不过长期来看,这部分很会被解耦,被分离出来。ASP.NET在IIS里的性能开销多半也是由于System.Web这个解不开根源,不过现在,我们有两个方式去搭建运行环境:
IIS
自宿主(Self-Host)
如果你想性能好点,你可以采取自宿主的方式;如果你想用到IIS那些为你做好的功能,那就用IIS吧。
链接:https://www.jianshu.com/p/7e518d30f57e
了解了一些基础理论,下面我们来实际开发。
OWIN Self-Host ASP.NET Web API 2
首先我们创建一个空的控制台项目:
然后通过Nuget来安装 Microsoft.AspNet.WebApi.OwinSelfHost
我们也可以打开NuGet控制台..输入命令:Install-Package Microsoft.AspNet.WebApi.OwinSelfHost
然后我们再添加一个OWIN启动类名为Startup 如下:
Startup中编写代码如下:
最后我们启动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