zl程序教程

您现在的位置是:首页 >  工具

当前栏目

Owin kanata 学习笔记

2023-09-27 14:23:57 时间

参考 : http://www.cnblogs.com/neverc/p/4864414.html

参考 : http://www.cnblogs.com/JustRun1983/p/3955238.html (这个有1,2,3部分)

 

配合 IIS 安装Nuget Microsoft.Owin.Host.SystemWeb

 

Setup startup class

using System.Web.Mvc;
using System.Web.Routing;
using Microsoft.Owin;
using Owin;
using ProjectOwin;

[assembly: OwinStartupAttribute(typeof(ProjectOwin.Startup))]
namespace ProjectOwin
{  
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            //MVC setup
            AreaRegistration.RegisterAllAreas();
            RouteConfig.RegisterRoutes(RouteTable.Routes);            
        }
    }
}

通过 assembly 来声明 class

<configuration>
  <appSettings>  
   <add key="owin:appStartup" value="ProjectOwin.Startup" />
  </appSettings>
</configuration>

通过web config 来声明 class

 

写入一个 Middlerware

[assembly: OwinStartupAttribute(typeof(ProjectOwin.Startup))]
namespace ProjectOwin
{
    public class HelloMiddlerware : OwinMiddleware
    {
        public HelloMiddlerware(OwinMiddleware next): base(next){}

        public override Task Invoke(IOwinContext context)
        {
            context.Response.Write("Hello World!");
            return Next.Invoke(context);
        }
    }
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.Use<HelloMiddlerware>();        
        }
    }
}

app.Run 和 app.Use 的区别 

app.Use<HelloMiddlerware>();
//Run是插入一个中间件,并终止继续往下流
app.Run(x => x.Response.WriteAsync("good"));
//此中间件将不执行
app.Use<HelloMiddlerware>();

 

执行顺序

public partial 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/>"));

        //1 Before, 2 Before 
        //hello world
        //2 After, 1 After 
    }
}

 

host, server, middleware, application 

host 是一个 exe 进程,监听着 TCP 请求,然后判断后选择 server 处理请求

server 负责把请求转换成Owin字典传给 middleware

middleware 对请求加工或者设置一些系统逻辑,然后pass 给下一个 middleware

application 不是很清楚这个.

 

passing data 

[assembly: OwinStartupAttribute(typeof(ProjectOwin.Startup))]
namespace ProjectOwin
{
    public class Abc
    {
        public string x { get; set; }
    }

    public class HelloMiddlerware : OwinMiddleware
    {
        public HelloMiddlerware(OwinMiddleware next) : base(next) { }

        public override Task Invoke(IOwinContext context)
        {
            context.Set<Abc>("key", new Abc { x = "5566" });  //使用 Get,Set
            Abc data = context.Get<Abc>("key"); 
            return Task.FromResult(0);
        }
    }
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        { 
            app.Use<HelloMiddlerware>();
        }
    }
}

 

IOwinContent.Environment = 原始的 IDictionary<string, Object>