Owin kanata 学习笔记
参考 : 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>
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 百万级群聊的设计实践
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)