ASP.NET开发规范:OWIN

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

时间: 2024-08-02 15:14:12

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

下一代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(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

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.

Sqoop 脚本开发规范(实例手把手带你写sqoop export和sqoop import)

首先,先明确,为什么Sqoop需要规范的脚本开发呢? 答:是因为,Sqoop import HDFS/Hive/HBase这些都是手动.但是在实际生产里,有时候,需要用脚本来完成. 比如,通过shell脚本来操作对Sqoop.Hive.HBase.MapReduce.HDFS.Spark.Storm等各种. Sqoop 脚本开发规范 目录规范 1.目录结构体系 /home/hadoop(开发用户)/app/djt(数据来源.业务)/sh/sqoop 示例:/home/hadoop/app/djt

C#语言开发规范-ching版

学习C#之初,始终不知道怎么命名比较好,很多时候无从命名,终于有一天我整理了一份命名规范文档,自此我就是按照这个命名规范书写代码,整洁度无可言表,拙劣之处请大家斧正,愚某虚心接受,如有雷同,不胜荣幸 C#语言开发规范 作者ching 1.  命名规范 a) 类 [规则1-1]使用Pascal规则命名类名,即首字母要大写. eg: Class Test { ... } [规则1-2]使用能够反映类功能的名词或名词短语命名类. [规则1-3]不要使用“I”.“C”.“_”等特定含义前缀. [规则1-