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
  • 相关阅读:
    poj 3528 (三维几何求凸包+凸包表面积)
    dijkstra模板(好像是斐波那契额堆优化,但我为什么看起来像优先队列优化,和spfa一样)
    最大空凸包模板
    ICPC 2017–2018, NEERC, Northern Subregional Contest St Petersburg, November 4, 2017 I题
    hdu 5248 序列变换
    hdu 2063(二分图模板测试)
    组合数
    85. Maximal Rectangle 由1拼出的最大矩形
    750. Number Of Corner Rectangles四周是点的矩形个数
    801. Minimum Swaps To Make Sequences Increasing 为使两个数组严格递增,所需要的最小交换次数
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/4883208.html
Copyright © 2011-2022 走看看