下一代Asp.net开发规范OWIN(2)—— 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

时间: 2024-12-29 23:27:57

下一代Asp.net开发规范OWIN(2)—— Katana介绍以及使用的相关文章

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

随着VS2013的发布,微软在Asp.Net中引入了很多新的特性,比如使用新的权限验证模块Identity, 使用Async来提高Web服务器的吞吐量和效率等.其中一个不得不提的是OWIN和Katana. OWIN的全称是Open Web Interface For .Net, OWIN是.Net开源社区借鉴Ruby而制定的.Net Web开发架构,有着非常简单的规范定义,同时极度降低了模块间耦合.OWIN并不是一个具体的实现,而只是一个规范,用来指导如何构建一个符合OWIN标准的Web生态环境

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

2014-09-04 07:22 by JustRun http://www.cnblogs.com/JustRun1983/p/3955238.html 随着VS2013的发布,微软在Asp.Net中引入了很多新的特性,比如使用新的权限验证模块Identity,使用Async来提高Web服务器的吞吐量和效率等.其中一个不得不提的是OWIN和Katana. OWIN的全称是Open Web Interface For .Net, OWIN是.Net开源社区借鉴Ruby而制定的.Net Web开发

下一代Asp.net开发规范OWIN(3)—— Middleware

Middleware是OWIN管道的基本组成单元,最后拼接的OWIN管道来处理客户端请求,输出网页.这篇文章,首先看看Web Form, MVC, Web API如何结合OWIN使用. 然后将如何编写Middleware和编写一个具体的Cache Middleware. 阅读目录: 一. 原有的Web Form, MVC项目如何结合OWIN? 1.1 通过路由配置,将程序分成多个部分,一些部分由Asp.net Web Form或者MVC处理,另外一部分由OWIN管道处理.     1.2 在We

ASP.NET开发规范:OWIN

ASP.NET开发规范:OWIN 今天投简历 准备面试了... 本节目录: OWIN简介 OWIN规范 Katana Hello World(3种Host) 自定义Middleware OWIN简介 OWIN(Open Web Interface For .Net) OWIN是.Net开源社区借鉴Ruby而制定的.Net Web开发架构,有着非常简单的规范定义,目标是用于解耦Web Server和Web Application. ASP.NET的局限性 ASP.NET核心是System.Web,

web前端开发规范

本文原创,这里首先声明,转载注明本文出处,翻版必究! web前端开发规范的现实意义 1.提高团队的协作能力 2.提高代码的重复利用率 3.可以写出质量更高,效率更好的代码 4.为后期维护提供更好的支持 5.可读性高 一.命名规则 1.html命名规则: a.文件名称命名规则:统一使用小写英文字母.数字.下划线的组合,不得包含汉字空格和特殊字符 2.命名原则:方便理解.方便查找 b.索引文件命名原则:index.html.index.htm.index.asp.index.aspx.index.j

JavaScript 开发规范要求详解

作为一名开发人员(We前端JavaScript开发),不规范的开发不仅使日后代码维护变的困难,同时也不利于团队的合作,通常还会带来代码安全以及执行效率上的问题.本人在开发工作中就曾与不按规范来开发的同事合作过,与他合作就不能用"愉快"来形容了.现在本人撰写此文的目的除了与大家分享一点点经验外,更多的是希望对未来的合作伙伴能够起到一定的借鉴作用.当然,如果我说的有不科学的地方还希望各路前辈多多指教.下面分条目列出各种规范要求,这些要求都是针对同事编码毛病提出来的,好些行业约定的其它规范可

转载 C#中敏捷开发规范

转载原地址 http://www.cnblogs.com/weixing/archive/2012/03/05/2380492.html 1.命名规则和风格 Naming Conventions and Style2  编码惯例 Coding Practices3  项目设置和结构 Project Settings and Structure4  Framework特别指导 Framework Specific Guidelines 4.1  数据访问 Data Access 4.2  ASP.

ASP.NET 开发必备知识点(2):那些年追过的ASP.NET权限管理

一.前言 在前一篇文章已经为大家介绍了OWIN和Katana,有了对他们的了解之后,才能更好地去学习Asp.net Identity,因为Asp.net Identity的实现集成了Owin.其实在Asp.net 2.0的时候,微软已经对用户权限管理进行了实现,其实现为Membership.由于之前的实现有很多限制,所以微软在Asp.net 4.5推出了Asp.net Identity.接下来,本篇文章将详细介绍下Asp.net Identity的实现. 二.Asp.net中用户权限管理发展历程

Getting Started with OWIN and Katana(Console 代替iis 制作 web服务的简单方案)

Open Web Interface for .NET (OWIN) defines an abstraction between .NET web servers and web applications. By decoupling the web server from the application, OWIN makes it easier to create middleware for .NET web development. Also, OWIN makes it easier