zoukankan      html  css  js  c++  java
  • 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

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 如果觉得还有帮助的话,可以点一下右下角的【推荐】,希望能够持续的为大家带来好的技术文章!想跟我一起进步么?那就【关注】我吧。
     
    分类: [13]ASP.NET
  • 相关阅读:
    spring冲刺第九天
    梦断代码读后感1
    spring冲刺第八天
    站立会议第三天
    站立会议第二天
    站立会议第一天
    购书问题
    团队项目NABCD分析
    你的灯亮着吗读书笔记3
    你的灯亮着吗读书笔记2
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4883208.html
Copyright © 2011-2022 走看看