ASP.NET开发规范:OWIN

今天投简历 准备面试了...

本节目录:

OWIN简介

OWIN(Open Web Interface For .Net)

OWIN是.Net开源社区借鉴Ruby而制定的.Net Web开发架构,有着非常简单的规范定义,目标是用于解耦Web Server和Web Application.

ASP.NET的局限性

ASP.NET核心是System.Web,而System.Web紧耦合IIS.IIS绑定在Windows OS上,所以ASP.NET 无法跨平台.

System.Web是.NET Framework重要组成,所以System.Web更新需要等待.NET的发布

OWIN规范

OWIN定义了4层:

2

Host:主要负责应用程序的配置和启动进程,包括初始化OWIN Pipeline、运行Server。

Server:绑定套接字并监听的HTTP请求然后将Request和Response的Body、Header封装成符合OWIN规范的字典并发送到OWIN Middleware Pipeline中

Middleware:称之为中间件、组件,位于Server与Application之间,用来处理发送到Pipeline中的请求

Application:这是具体的应用程序代码,只不过我们将他们注册到OWIN Pipeline中去处理HTTP 请求,成为OWIN管道的一部分

OWIN接口

Func<IDictionary<string, object>, Task>;

用于Server和Middleware的交互。他并不是严格意义上的接口,而是一个委托并且每个OWIN中间件组件必须提供。

其中参数类型为IDictionary<string,object>的变量为环境变量

Katana

微软引入并推广OWIN,同时依照OWIN规范,实现了Katana。

Host

宿主只是一个进程,是整个OWIN程序的载体。这个宿主可以是IIS, IIS Express, Console, Windows Service等。

Katana为我们提供了3中选择:

  • IIS / ASP.NET :使用IIS是最简单和向后兼容方式,在这种场景中OWIN Pipeline通过标准的HttpModule和HttpHandler启动。使用此Host你必须使用System.Web作为OWIN Server
  • Self-Host :如果你想要使用其他Server来替换掉System.Web,并且可以有更多的控制权,可以选择创建一个自定义宿主,如使用Windows Service、控制台应用程序、Winform来承载Server
  • OwinHost :也可以使用Katana提供的OwinHost.exe:他是一个命令行应用程序,运行在项目的根部,启动HttpListener Server并找到基于约束的Startup启动项

Server

负责绑定到 TCP 端口,监听端口发送过来的请求,同时将请求的信息依照OWIN规范,包装成字典格式,传递到下层的Middleware

Katana对OWIN Server的实现分为如下几类:

  • System.Web:当使用IIS作为Host时,System.Web把自己注册为HttpModule和HttpHandler并且处理发送给IIS的请求(Microsoft.Owin.Host.SystemWeb)
  • HttpListener:这是OwinHost.exe和自定义Host默认的Server。(Microsoft.Owin.Host.HttpListener)
  • WebListener:这是ASP.NET vNext默认的轻量级Server,他目前无法使用在Katana中

Middleware

这是为组成 OWIN 管道中的组件。

Middleware可以理解为提供Func<IDictionary<string, object>, Task>接口的组件。

Katana提供了一个OwinMiddleware基类更加方便我们继承来实现OWIN Middleware.

Application

具体的代码实现,比如ASP.NET Web API、SignalR具体代码的实现。

事实上,对于这些类型的应用程序,Katana 组件只需使用一个小的配置类即可见。

Hello World

IIS-Host

新建一个空的Web项目,Nuget引用Microsoft.Owin.Host.SystemWeb

创建Startup类

1
2
3
4
5
6
7
8
9
10
11
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Run(context =>
        {
            context.Response.ContentType = "text/plain";
            return context.Response.WriteAsync("Hello World!");
        });
    }
}

访问项目地址:http://localhost:xx

Self-Host

新建控制台项目,Nuget引用Microsoft.Owin.SelfHost

Main方法

1
2
3
4
using (WebApp.Start<Startup>("http://localhost:12345"))
{
    Console.ReadLine();
}

创建Startup类

1
2
3
4
5
6
7
8
9
10
11
12
13
    class Startup
    {
        public void Configuration(IAppBuilder app)
        {
#if DEBUG
            //诊断
            app.UseErrorPage();
#endif
            //欢迎页
            //app.UseWelcomePage("/");
            app.Run(x=>x.Response.WriteAsync("hello world"));
        }
    }

访问地址:http://localhost:12345

OWIN-Host

新建类库项目,Nuget引用OwinHost

创建Startup类(需要程序集Owin和Microsoft.Owin)

1
2
3
4
5
6
7
8
9
10
11
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Run(context =>
        {
            context.Response.ContentType = "text/plain";
            return context.Response.WriteAsync("Hello World!");
        });
    }
}

OwinHost.exe

这里需要注意

  1. Nuget下载完,OwinHost.exe会在package文件夹里
  2. OwinHost.exe会加载./bin文件夹下的程序集作为server assembly

所以我们将这OwinHost.exe3个文件移动到

=>

另外将Debug或者Release文件夹下的文件移动到bin文件夹下

cmd运行OwinHost.exe

访问:http://localhost:5000/

自定义Middleware

Middleware非常类似于HttpModule,会注册到Owin的pipeline中执行代码.

继承OwinMiddleware

1
2
3
4
5
6
7
8
9
10
11
12
13
public class HelloMiddlerware : OwinMiddleware
{
    public HelloMiddlerware(OwinMiddleware next)
        base(next)
    {
    }
 
    public override Task Invoke(IOwinContext context)
    {
        context.Response.Write("hello"+DateTime.Now);<br>        //管道继续往下走
        return Next.Invoke(context);
    }
}

Startup

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888
        //管线自由组合
        app.Use<HelloMiddlerware>();
        //Run是插入一个中间件,并终止继续往下流
        app.Run(x => x.Response.WriteAsync("good"));
        //此中间件将不执行
        app.Use<HelloMiddlerware>();
    }
}

来看一下组件的执行顺序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.Use((x, next) =>
        {
            x.Response.ContentType = "text/html";
            return next.Invoke();
        });
        app.Use((x, next) =>
        {
            x.Response.WriteAsync("1 Before");
            next.Invoke();
            return x.Response.WriteAsync("1 After");
        });
        app.Use((x, next) =>
        {
            x.Response.WriteAsync("2 Before");
            next.Invoke();
            return x.Response.WriteAsync("2 After");
        });
        app.Run(x => x.Response.WriteAsync("<br/>hello world<br/>"));
    }
}

浏览结果:

扩展

Startup类如何被关联

1.默认名称匹配
可以定义Startup.cs类,只要这个类的namespace和Assembly的名称相同。那么,这个Startup.cs中的Configuration方法,就会在OWIN管道初始化的时候执行。

2.使用OwinStartup Attribute
这就是我们例子中使用的方式,直接指定哪个具体类是Startup类。

3.在配置文件的appSetting 节点设置

1
2
3
<appSettings> 
  <add key="owin:appStartup" value="StartupDemo.ProductionStartup" />
</appSettings>

Pipeline

Owin的pipeline在IIS Host上本质是注册到Httpapplication的pipeline上.

如:app.UseStageMarker(PipelineStage.Authenticate);

本文参考:

http://www.cnblogs.com/JustRun1983/p/3955238.html

Katana:http://www.asp.net/aspnet/overview/owin-and-katana/an-overview-of-project-katana

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧。
 
分类: [13]ASP.NET

ASP.NET开发规范:OWIN的更多相关文章

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

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

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

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

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

    Middleware是OWIN管道的基本组成单元,最后拼接的OWIN管道来处理客户端请求,输出网页.这篇文章,首先看看Web Form, MVC, Web API如何结合OWIN使用. 然后将如何编写 ...

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

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

  5. [ASP.NET] 下一代ASP.NET开发规范:OWIN

    今天投简历 准备面试了... 本节目录: OWIN简介 OWIN规范 Katana Hello World(3种Host) 自定义Middleware OWIN简介 OWIN(Open Web Int ...

  6. ASP.NET 开发必备知识点(1):如何让Asp.net网站运行在自定义的Web服务器上

    一.前言 大家都知道,在之前,我们Asp.net 的网站都只能部署在IIS上,并且IIS也只存在于Windows上,这样Asp.net开发的网站就难以做到跨平台.由于微软的各项技术的开源,所以微软自然 ...

  7. C#开发规范总结(个人建议)

    .NET开发编程规范 章程序的版式 版式虽然不会影响程序的功能,但会影响可读性.程序的版式追求清晰.美观,是程序风格的重要构成因素. 可以把程序的版式比喻为"书法".好的" ...

  8. 转载 C#中敏捷开发规范

    转载原地址 http://www.cnblogs.com/weixing/archive/2012/03/05/2380492.html 1.命名规则和风格 Naming Conventions an ...

  9. C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?

    C#中??和?分别是什么意思? 在C#中??和?分别是什么意思? 1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空.例如:string str=null; ...

随机推荐

  1. Radmin远程控制软件

    Radmin远程控制软件 日期:2015-08-20     作者:lujl   Radmin是一款快速的远程控制软件,可以用来远程管理公司或个人计算机来实现远程办公.你可以通过鼠标和键盘来控制远程的 ...

  2. Storm具体解释一、Storm 概述

    一.Storm概述      Storm是一个分布式的.可靠的.零失误的流式数据处理系统. 它的工作就是委派各种组件分别独立的处理一些简单任务.在Storm集群中处理输入流的是Spout组件,而Spo ...

  3. 点集配对问题(状态dp)

    给定n个点(n是偶数)使得两个点两两配对,最后总的距离和最小. 用是表示集合,那么dp[s]表示集合s配对后的最小距离和  , 状态转换方程为  表示集合中任意拿两个元素配对,然后转移为更小的两个集合 ...

  4. 使IIS Express支持其他网络客户端访问

    今天尝试利用Android客户端Web浏览器访问VS2012 IIS Express调试中的Web应用,发现这个IIS Express仅支持localhost主机名地址访问. 上网搜索找到解决方案,几 ...

  5. Linux 软连接与硬连接

    Linux 软连接与硬连接 对于一个文件来说,有唯一的索引接点与之相应,而对于一个索引接点号,却能够有多个文件名称与之相应.因此,在磁盘上的同一个文件能够通过不同的路径去訪问该文件.注意在Linux下 ...

  6. 佛祖保佑 永无BUG 永不改动

    //////////////////////////////////////////////////////////////////// // _ooOoo_ // // o8888888o // / ...

  7. zabbix通过脚本发送短信

    zabbix通过脚本发送短信 原则 和zabbix电子邮件是一样的,他们是action内部配置,司的api来完毕.当然网上有不少利用139邮箱来发的,这个事实上算调用email的一种,这里复述的是调用 ...

  8. 为Linux用ISO制作U盘启动及基本原理

    制作成功后的基本最简文件夹文件图 一.系统的基本引导流程: 首先系统要引导isolinux.bin可执行程序,此程序是移动介质上引导用的,isolinux.bin执行成功后会载入其配置文件syslin ...

  9. HTML5管理与实际历史的分析(history物)

    HTML5新进入历史的管理,更新history对象允许国家的经营历史更方便. 在现代Web应用.用户"前进"和"退却"button切换历史页面.这使得新的页码不 ...

  10. Sliverlight实例之 绘制扇形和环形图

    一,1道几何题 已知两点坐标确定一条直线,直线上存在一个未知点,起始点与未知点的距离已知 求:未知点坐标 思路,如下: 求AB长度,可以根据两点距离公式 二,写个C#类 定义一个Point类,代表坐标 ...