OWIN Kantana

Kantana是遵守OWIN规范的应用框架,下面四层架构也正是OWIN的规范

架构

Host

宿主层,是OWIN程序的载体,这个宿主可以是IIS, IIS Express, Console, Windows Service等。

Katana通过在IIS上构建一个类似适配器,使得OWIN管道能够运行在IIS上,同时Katana也已经提供了一个可以直接运行Host——OwinHost.exe

作用
1. 管理底层进程
2. 当有请求过来的时候,选择相应的Server和构建OWIN管道处理请求。

Server

负责绑定到 TCP 端口,监听端口发送过来的请求,同时将请求的信息依照OWIN规范,包装成字典格式,传递到下层的Middleware.
IIS既可以作为Host层,也可以作为Server层

Microsoft.Owin.Host.SystemWeb

这个是用来对应IIS的,由于IIS既是Host,又是Server. 所以这个Server实现的作用是注册ASP.NET HttpModule和HttpHandler阻断原有的处理流程,转而把请求发送到OWIN管道中处理

Microsoft.Owin.Host.HttpListener
使用HttpListener打开Socket端口,监听请求,然后将请求包装发送到OWIN管道中处理。

字典: OWIN将web应用中的request, response, session, cookie等所有相关信息都简化成下面的字典


"owin.RequestBody"


请求报文体数据流. 如果没有报文体使用Stream.Null作为占位符.


"owin.RequestHeaders"


一个 IDictionary<string, string[]><string, string[]="">  类型请求头字典. See Headers.


"owin.RequestMethod"


string containing the HTTP request method of the request (e.g., "GET""POST").


"owin.RequestPath"


string containing the request path. The path MUST be relative to the "root" of the application delegate; see Paths.


"owin.RequestPathBase"


string containing the portion of the request path corresponding to the "root" of the application delegate; see Paths.


"owin.RequestProtocol"


string containing the protocol name and version (e.g. "HTTP/1.0" or "HTTP/1.1").


"owin.RequestQueryString"


string containing the query string component of the HTTP request URI, without the leading “?” (e.g., "foo=bar&baz=quux"). The value may be an empty string.


"owin.RequestScheme"


string containing the URI scheme used for the request (e.g., "http""https"); see URI Scheme.

Middleware

类似Asp.Net的Module的职责,OWIN 管道中的组件,Katana提供了一个OwinMiddleware基类更加方便我们继承来实现OWIN Middleware.

Application

应用程序代码

Owin核心定义

OWIN将web应用中的request, response, session, cookie等所有相关信息都简化成字典(表见上)

这是所有运行在OWIN协议下的组件都需要遵循的接口Func<IDictionary<string, object>, Task>;

简单的Web Host Demo

上面提到了Kantana支持多种宿主,这里只介绍Web Host

根据Owin协议,Middleware需要通过Func<IDictionary<string, object>, Task>添加

在空的MVC5项目中右键添加项可以创建一个Owin Startup类

  1. [assembly: OwinStartup(typeof(OwinDemo.Startup))]
  2. namespace OwinDemo
  3. {
  4. public class Startup
  5. {
  6. public void Configuration(IAppBuilder app)
  7. {
  8. // 有关如何配置应用程序的详细信息,请访问 http://go.microsoft.com/fwlink/?LinkID=316888
  9. app.Run(context =>
  10. {
  11. context.Response.ContentType = "text/plain";
  12. return context.Response.WriteAsync("Hello, world.");
  13. });
  14. }
  15. }
  16. }

Startup类可以理解为传统的Global.asax

上面代码演示了注册一个Middleware到Owin管道,app.Run的方法签名如下

public static void Run(this IAppBuilder app, Func<IOwinContext, Task> handler);

这是个扩展方法,它有一个委托参数,正是Owin定义要求的那个委托,利用他我们能给管道注册Middleware

而委托参数是一个IOwinContext接口,他的成员如下

  1. public interface IOwinContext
  2. {
  3. IAuthenticationManager Authentication { get; }
  4. IDictionary<string, object> Environment { get; }
  5. IOwinRequest Request { get; }
  6. IOwinResponse Response { get; }
  7. TextWriter TraceOutput { get; set; }
  8. T Get<T>(string key);
  9. IOwinContext Set<T>(string key, T value);
  10. }

可以看到Http请求中要用到的东西都能通过这个接口获得.另外这次请求相关的数据都封装成字典保存在Environment

上述代码中的[assembly: OwinStartup(typeof(OwinDemo.Startup))]是用来设置Owin启动类

更多的设置方法看下文

Middleware

我们通过集成OwinMiddleware来编写自己的中间件

  1. public class HelloWorldMiddleware : OwinMiddleware
  2. {
  3. public HelloWorldMiddleware(OwinMiddleware next) : base(next)
  4. {
  5. }
  6. public override Task Invoke(IOwinContext context)
  7. {
  8. var response = "Hello World! It is " + DateTime.Now;
  9. context.Response.Write(response);
  10. return Next.Invoke(context);
  11. }
  12. }?

中间件的执行过程根据Startup类中注册的顺序.上述代码的Next.Invoke代表执行下一个中间件

  1. public class Startup
  2. {
  3. public void Configuration(IAppBuilder app)
  4. {
  5. app.Use((x, next) =>
  6. {
  7. x.Response.ContentType = "text/html";
  8. return next.Invoke();
  9. });
  10. app.Use((x, next) =>
  11. {
  12. x.Response.WriteAsync("1 Before");
  13. next.Invoke();
  14. return x.Response.WriteAsync("1 After");
  15. });
  16. app.Use((x, next) =>
  17. {
  18. x.Response.WriteAsync("2 Before");
  19. next.Invoke();
  20. return x.Response.WriteAsync("2 After");
  21. });
  22. app.Run(x => x.Response.WriteAsync("<br/>hello world<br/>"));
  23. }
  24. }


注意app.Use是添加中间件,而app.Run仅仅只是执行,app.Run后面的代码是不执行的,也就是在app.Run后面使用app.Use是无效的

Owin启动

一.约定

Kantana寻找一个名字程序集名称或全局命名空间匹配的命名空间中的 Startup

二.OwinStartup 特性

在类名上面添加


1

[assembly:OwinStartup(typeof(startClassType))]

三.使用配置文件

在web.config中的appSetting添加相关配置

指定类名


1

<addkey="owin:appStartup"value="StartupDemo.ProductionStartup"/>

指定类名和程序集


1

<addkey="owin:appStartup"value="StartupDemo.ProductionStartup,StartupDemo"/>

带friendlyname的配置方式


1

<addkey="owin:appStartup"value="ProductionConfiguration"/>

这种方式要求类名上面也要使用特性标签,并注明friendlyname


1

[assembly:OwinStartup("ProductionConfiguration",typeof(StartupDemo.ProductionStartup2))]

摘抄至

http://www.asp.net/aspnet/overview/owin-and-katana

http://www.cnblogs.com/JustRun1983/p/3967757.html

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

来自为知笔记(Wiz)

时间: 2024-08-04 19:29:24

OWIN Kantana的相关文章

Enable OWIN Cross-origin Request

微软出了一套解决方案可以解决 "允许WebAPI的 CORS 请求" http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api 如果你同时使用了OWIN,即使使用了这个,也不能使OWIN 允许 cross-origin 请求. OWIN 是基于kantana的一套OAUTH2.0解决方案. 所以要使用 DLL Microsoft.OWIN.Cros I installed

如何定义一个有效的OWIN Startup Class

命名约定 Katana在程序集内的程序集名称空间下查找一个叫做Startup的类, 通过属性指定 [assembly: OwinStartup(typeof(OwinConsoleApp.Startup))] 通过配置文件 <add key="owin:appStartup" value="OwinConsoleApp.Startup1" /> 定义友好命名的Startup类 <appSettings> <add key="o

基于OWIN+DotNetOpenOAuth实现OAuth2.0

这几天时间一直在研究怎么实现自己的OAuth2服务器,对于太了解OAuth原理以及想自己从零开始实现的,我建议可以参考<Apress.Pro ASP.NET Web API Security>里面的章节.最后发现其实微软在这方面也已经做了实现,所以文介绍下怎么基于OWIN来实现自己的OAuth2.0授权服务器,,以及怎么使用DotNetOpenAuth作为客户端来访问受保护的资源.  OWIN是一套specification,微软的Katana开源项目是基于OWIN标准开发的,所以本本文更准确

MVC5 - ASP.NET Identity登录原理 - Claims-based认证和OWIN

在Membership系列的最后一篇引入了ASP.NET Identity,看到大家对它还是挺感兴趣的,于是来一篇详解登录原理的文章.本文会涉及到Claims-based(基于声明)的认证,我们会详细介绍什么是Claims-based认证,它与传统认证方式的区别,以及它的特点.同时我们还会介绍OWIN (Open Web Interface for .NET) 它主要定义了Web Server 和Web Application之间的一些行为,然后实现这两个组件的解耦(当然远不止这么点东西,我相信

Nancy之基于Nancy.Owin的小Demo

前面做了基于Nancy.Hosting.Aspnet和Nancy.Hosting.Self的小Demo 今天我们来做个基于Nancy.Owin的小Demo 开始之前我们来说说什么是Owin和Katana 什么是Owin呢? 官网地址:http://owin.org OWIN在.NET Web Servers与Web Application之间定义了一套标准接口,OWIN的目标是用于解耦Web Server和Web Application. 什么是Katana呢? 官网地址:http://kata

OWIN 为WebAPI

OWIN 为WebAPI 宿主 跨平台 OWIN是什么? OWIN的英文全称是Open Web Interface for .NET. 如果仅从名称上解析,可以得出这样的信息:OWIN是针对.NET平台的开放Web接口. 那Web接口是谁和谁之间的接口呢?是Web应用程序与Web服务器之间的接口,OWIN就是.NET Web应用程序与Web服务器之间的接口. 为什么需要这样一个接口呢?因为.NET Web应用程序是运行于Web服务器之中的,.NET Web应用程序需要通过Web服务器接收用户的请

OWIN初探

什么是 OWIN ? OWIN 的全称是 "Open Web Interface for .NET", OWIN 在 .NET Web 服务器和 .NET Web 应用之间定义了一套标准的接口, 其目的是为了实现服务器与应用之间的解耦, 鼓励为 .NET Web 应用开发简单模块. OWIN 是一个开源开放的标准, 有助于建设 .NET 开发的开源生态环境,OWIN 定义了如下几个概念: 服务器 (Server) HTTP 服务器直接与客户端交互, 并用 OWIN 语义处理请求,服务器

Owin

Owin应用程序代理using AppFunc=Func<IDictionary<string,object>,Task>; IDictionary<string,object>环境变量,贯穿整个处理流程 Microsoft.Owin.Host.SystemWeb可以接管IIS请求(App>Middleware>Server>Host)Server层MIcrosoft.Owin.Host.HttpListener(Server层,可以实现控制台寄宿)M

Owin与mvc

学习连接http://www.cnblogs.com/JustRun1983/p/3967757.html Web Form和MVC现在还不能作为一个中间件集成到OWIN管道中,所有要么二选一,要么先后执行.二选一就是根据路由匹配选择执行方式,先后执行就是先执行Owin管道,后执行mvc. 第一部分: 直接表达式方法 [assembly: OwinStartup(typeof(OwinTest.Startup))] namespace OwinTest { public class Startu