接上篇OWIN产生的背景以及简单介绍,在了解了OWIN规范的前因后果后,接下来看一下Katana这个OWIN规范的实现,并看看如何使用在咱们的Web开发中。html
阅读目录:浏览器
一. Katana项目的结构和包含的内容服务器
1.1 Host
1.2 Server
1.3 Middleware
1.4 Application架构
二. Katana示例代码Hello World
2.1 使用IIS Host运行Hello World
2.2 将Hello World迁移到在自定义Hostapp
三. OWIN Startup配置类详解框架
3.1 怎么没有OWIN规范中的IDictionary<string, object>和Func<IDictionary<string, object>, Task>?
3.2 Host是如何连接到Startup类的?函数
一. Katana项目的结构和包含的内容
经过了解Katana项目结构,咱们可以更加深刻的理解OWIN规范。下面这张图就是Katana项目的主要架构。post

上图中的各个部分解释:ui
1.1 Host
宿主只是一个进程,是整个OWIN程序的载体。这个宿主能够是IIS, IIS Express, Console, Windows Service等。
Host的主要做用:
1. 管理底层进程
2. 当有请求过来的时候,选择相应的Server和构建OWIN管道处理请求。this
咱们最熟悉的Host就是IIS/Asp.net. 不过IIS既是Host, 也是Server. 在IIS中使用标准的HttpModule和HttpHandler类型来响应请求。Katana经过在IIS上构建一个相似适配器,使得OWIN管道可以运行在IIS上。
咱们还能够本身实现一个简单的Host, 这个Host能够在Console中,也能够是一个Windows Service进程。同时Katana也已经提供了一个能够直接运行Host——OwinHost.exe
1.2 Server
负责绑定到 TCP 端口,监听端口发送过来的请求,同时将请求的信息依照OWIN规范,包装成字典格式,传递到下层的Middleware.
Katana项目包含了2个Server实现:
Microsoft.Owin.Host.SystemWeb
这个是用来对应IIS的,因为IIS既是Host,又是Server. 因此这个Server实现的做用是注册ASP.NET HttpModule和HttpHandler阻断原有的处理流程,转而把请求发送到OWIN管道中处理。
Microsoft.AspNet.Host.SystemWeb依赖于Sysetm.Web, 和IIS耦合厉害,因此没法迁移到非IIS服务器
Microsoft.Owin.Host.HttpListener
使用HttpListener打开Socket端口,监听请求,而后将请求包装发送到OWIN管道中处理。
1.3 Middleware:
这是为组成 OWIN 管道中的组件。 它能够是从简单压缩组件到 ASP.NET Web API 这样的完整框架.
当从客户端发送一个请求,这个请求就会传到OWIN管道中处理。这个管道是在startup code中初始化的。组成管道的组件就是Middleware.
要遵循OWIN标准,Middleware应该要实现
Func<IDictionary<string, object>, Task>
Katana提供了一个OwinMiddleware基类更加方便咱们继承来实现OWIN Middleware.
1.4 Application
这是您的程序代码。 因为 Katana 并不取代 ASP.NET,而是一种编写和托管组件的新方式,所以现有的 ASP.NET Web API 和 SignalR 应用程序将保持不变,由于这些框架能够参与 OWIN 管道。 事实上,对于这些类型的应用程序,Katana 组件只需使用一个小的配置类便可见。
OWIN和Katana并非一个全新的开发方式,并不取代 ASP.NET,是实现Host, Server和Applicantion之间解耦,是一种编写和托管组件的新方式 。好比使用OWIN方式开发Web API, 咱们仍然仍是使用Asp.net Web API. 只是Web API变成了咱们OWIN管道的一个组成部分了。正常开发中,咱们感受不到OWIN的存在,只是在startup代码中,构建咱们的OWIN管道。一般,对于Web API和SignalR这种大型组件,咱们都是注册在OWIN管道的最后。可是像authentication , cache这样的组件,咱们一般会注册到管道前部。
二. Katana示例代码Hello World
下面的示例是在VS 2013中操做的。
2.1 使用IIS Host运行Hello World
使用IIS做为宿主,是咱们经常使用的方式。经过在IIS上创建一个OWIN管道,运行咱们的程序。
首先,在VS2013中,建立一个新的Asp.net程序。

在弹出框中,选择Empty模板

从Nuget中添加支持包
下一步是添加OWIN的支持包。从Tools-> Library Package Manager-> Package Manager Console. 而后在命令窗口中,运行install-package Microsoft.Owin.Host.SystemWeb.
也能够直接在nuget包管理界面上添加

添加Startup启动类
Startup类的做用是用来初始化OWIN管道,这里,咱们添加和初始化OWIN管道中的Middleware.

在Startup1.Configuration方法中,添加以下代码:
public void Configuration(IAppBuilder app)
{
// New code:
app.Run(context =>
{
context.Response.ContentType = "text/plain";
return context.Response.WriteAsync("Hello, world.");
});
}
上面的代码作的事情,就是把一个简单的Middleware注册到OWIN管道中。这个中间件完成的事情很是简单: 当接受到请求的时候,输出Hello World.
启动程序运行,结果页面以下:

2.2 将Hello World迁移到在自定义Host
从IIS Host迁移到自定义Host很是简单。使用IIS Host, IIS同时充当了Host和Server的角色。在自定义Host中, 咱们将用Console程序做为Host, 同时用HttpListener类来做为Server,监听固定端口发送的Http请求.
首先建立一个简单的Console应用程序,用Nuget添加Microsoft.Owin.SelfHost

一样添加上咱们的Startup1.cs, 而后将咱们的Console程序改形成Host宿主。
class Program
{
static void Main(string[] args)
{
using (Microsoft.Owin.Hosting.WebApp.Start<Startup1>("http://localhost:9000"))
{
Console.WriteLine("Press [enter] to quit...");
Console.ReadLine();
}
}
}
启动程序,而后在浏览器中键入http://localhost:9000访问.
能够看到,OWIN的应用,耦合关联很是少,很是容易地在不一样的Host之间迁移。之后在有除IIS外更多优秀的Host/Server涌现的时候,咱们的选择就会更多
三. OWIN Startup配置类详解
上面咱们分别用IIS和Console为宿主,运行了一个简单的Hello World程序。虽然只是一个简单的Hello World, 其实里面包含的内容仍是挺多的,下面就来一一介绍。
3.1 怎么没有OWIN规范中的IDictionary<string, object>和Func<IDictionary<string, object>, Task>?
上篇文章中,讲到OWIN规范的时候,提到过在OWIN管道中传输的数据形式是IDictionary<string, object>,可是在咱们的代码中,并无出现.
缘由是在微软的OWIN实现中,将字典类型包装到了IOwinContext接口类型中。其实能够经过属性Environment能够访问到该字典,同时还包装经常使用的request, reponse属性。这样咱们就无需直接和IDictionary<string, object>打交道, 在OWIN规范上,字典类型是个很是好的设计,简单通用,可是在实际开发中,直接操做字典类型获取object, 而后再转换类型等毕竟不是一个直观和方便的过程。
咱们的Startup.cs代码中,下面的context参数类型,其实就是IOwinContext.
app.Run(context =>
{
context.Response.ContentType = "text/plain";
return context.Response.WriteAsync("Hello, world.");
});
关于另一个问题,Func<IDictionary<string, object>, Task>在哪里?咱们来看看Run函数的定义就一目了然了:
public static void Run(this IAppBuilder app, Func<Microsoft.Owin.IOwinContext, System.Threading.Tasks.Task> handler);
Startup.cs中,主要完成的工做,就是使用IAppBuilder来注册Middleware到OWIN管道中。咱们用lambda表达式注册的Hello World, 其实就是一个Middleware组件,只是这个Middleware组件太简单了。
3.2 Host是如何连接到Startup类的?
不管你使用IIS, IIS Express仍是OWIN Host, 微软在这些Host上实现的Service都会依照特定的规则来寻找到Startup类,执行Configuration方法,注册Middleware.
默认名称匹配
能够定义Startup.cs类,只要这个类的namespace和Assembly的名称相同。那么,这个Startup.cs中的Configuration方法,就会在OWIN管道初始化的时候执行。
使用OwinStartup Attribute
这就是咱们例子中使用的方式,直接指定哪一个具体类是Startup类。
在配置文件的appSetting 节点设置
<appSettings>
<add key="owin:appStartup" value="StartupDemo.ProductionStartup" />
</appSettings>
经过上面的讲解,但愿能帮助你们理解Katana在实际项目中的使用。下一篇中,更加接近实战,一块儿看看咱们编写Middleware