Katana介绍以及使用

接上篇OWIN产生的背景以及简单介绍,在了解了OWIN规范的来龙去脉后,接下来看一下Katana这个OWIN规范的实现,并看看如何使用在我们的Web开发中。

阅读目录:

一. 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迁移到在自定义Host

三. OWIN Startup配置类详解

3.1 怎么没有OWIN规范中的IDictionary<string, object>和Func<IDictionary<string, object>, Task>?
     3.2 Host是如何链接到Startup类的?

一. Katana项目的结构和包含的内容

通过了解Katana项目结构,我们能够更加深入的理解OWIN规范。下面这张图就是Katana项目的主要架构。

上图中的各个部分解释:

1.1 Host

宿主只是一个进程,是整个OWIN程序的载体。这个宿主可以是IIS, IIS Express, Console, Windows Service等。
Host的主要作用:
1. 管理底层进程
2. 当有请求过来的时候,选择相应的Server和构建OWIN管道处理请求。

我们最熟悉的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

Katana介绍以及使用的更多相关文章

  1. 下一代Asp.net开发规范OWIN(2)—— Katana介绍以及使用

    接上篇OWIN产生的背景以及简单介绍,在了解了OWIN规范的来龙去脉后,接下来看一下Katana这个OWIN规范的实现,并看看如何使用在我们的Web开发中. 阅读目录: 一. Katana项目的结构和 ...

  2. Nancy之基于Nancy.Owin的小Demo

    前面做了基于Nancy.Hosting.Aspnet和Nancy.Hosting.Self的小Demo 今天我们来做个基于Nancy.Owin的小Demo 开始之前我们来说说什么是Owin和Katan ...

  3. 全新的membership框架Asp.net Identity(2)——绕不过的Claims

    本来想直接就开始介绍Identity的部分,奈何自己挖坑太深,高举高打的方法不行.只能自己默默下载了Katana的源代码研究了好一段时间.发现要想能够理解好用好Identity, Claims是一个绕 ...

  4. Owin Katana 的分析介绍

    本文首要是对美团的分布式ID结构Leaf的原理进行介绍,针对Leaf原项目中的一些issue,对Leaf项目进行功用增强,问题修正及优化改善,改善后的项目地址在这里: Leaf项目改善计划 https ...

  5. 如何安装并简单的使用OwinHost——Katana

    微软OWIN的提出必然会引起一场风暴,而我们作为C#阵营中一份子,自然免不了会卷入其中.OWIN是什么东西,我在这里就不解析了,还不知道是OWIN是什么的读者请打开浏览器,然后搜索即可,中文的英文的应 ...

  6. 下一代Asp.net开发规范OWIN(1)—— OWIN产生的背景以及简单介绍

    随着VS2013的发布,微软在Asp.Net中引入了很多新的特性,比如使用新的权限验证模块Identity, 使用Async来提高Web服务器的吞吐量和效率等.其中一个不得不提的是OWIN和Katan ...

  7. ASP.NET MVC随想录——锋利的KATANA

    正如上篇文章所述那样,OWIN在Web Server与Web Application之间定义了一套规范(Specs),意在解耦Web Server与Web Application,从而推进跨平台的实现 ...

  8. <转>下一代Asp.net开发规范OWIN(1)—— OWIN产生的背景以及简单介绍

    2014-09-04 07:22 by JustRun http://www.cnblogs.com/JustRun1983/p/3955238.html 随着VS2013的发布,微软在Asp.Net ...

  9. ASP.NET MVC5 学习笔记-4 OWIN和Katana

    1. Owin OWIN全名:Open Web Interface for .NET. 它是一个说明,而非一个框架,该声明用来实现Web服务器和框架的松耦合.它提供了模块化.轻量级和便携的设计.类似N ...

随机推荐

  1. MVC把随机产生的字符串转换为图片

    原文:MVC把随机产生的字符串转换为图片 Insus.NET在这篇中<在ASP.NET MVC应用程序中随机获取一个字符串>http://www.cnblogs.com/insus/p/3 ...

  2. Extjs grid column里添加button等html标签,并增加点击事件

    Extjs里有个actioncolumn,但actioncolumn只能添加一系列button,不能既有字又有button 如何能在column里增加html标签,并给button添加事件呢? 1. ...

  3. HDOJ 4248 A Famous Stone Collector DP

    DP: dp[i][j]前i堆放j序列长度有多少行法, dp[i][j]=dp[i-1][j] (不用第i堆), dp[i][j]+=dp[i-1][j-k]*C[j][k] (用第i堆的k个石头) ...

  4. C++11于once_flag,call_once分析的实现

    基于该分析llvm的libc++,代替gun的libstdc++,由于libstdc++的代码里太多宏了,看起来蛋疼. 在多线程编程中,有一个常见的情景是某个任务仅仅须要运行一次.在C++11中提供了 ...

  5. WiX Toolset

    原文:WiX Toolset 公司换软件打包平台,弄了一个月,Wix toolset的中文资料真的不多,逼着自己看了不少英文资料,终于弄懂了WiX打包的过程,做出了满足要求的安装包 一点基本概念:(F ...

  6. POJ 2774 后缀数组:查找最长公共子

    思考:其实很easy.就在两个串在一起.通过一个特殊字符,中间分隔,然后找到后缀数组的最长的公共前缀.然后在两个不同的串,最长是最长的公共子串. 注意的是:用第一个字符串来推断是不是在同一个字符中,刚 ...

  7. Https 客户端与服务器交互过程梳理(转)

    本文试图以通俗易通的方式介绍Https的工作原理,不纠结具体的术语,不考证严格的流程.我相信弄懂了原理之后,到了具体操作和实现的时候,方向就不会错,然后条条大路通罗马.阅读文本需要提前大致了解对称加密 ...

  8. crawler_java_数据平台结构

    大数据生态架构

  9. Java设计模式偷跑系列(十二)组合模式建模和实现

    转载请注明出处:http://blog.csdn.net/lhy_ycu/article/details/39828653 组合模式(Composite):组合模式有时又叫部分-总体模式.将对象组合成 ...

  10. 【百度地图API】北京周边7日游——图标按路线轨迹行动

    原文:[百度地图API]北京周边7日游--图标按路线轨迹行动 任务描述: 春节就要来啦~酸奶小妹的妈妈要从遥远的重庆,来到北京过春节呢!酸奶小妹忙着给妈妈计划,北京周边的旅游线路.计划好路线后,就开始 ...