DotNet 学习笔记 OWIN
- Open Web Interface for .NET (OWIN)
- -------------------------------------------------------------------------
- Running OWIN middleware in the ASP.NET pipeline
- "dependencies": {
- "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
- "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
- "Microsoft.AspNetCore.Owin": "1.0.0"
- },
- public Task OwinHello(IDictionary<string, object> environment)
- {
- string responseText = "Hello World via OWIN";
- byte[] responseBytes = Encoding.UTF8.GetBytes(responseText);
- // OWIN Environment Keys: http://owin.org/spec/spec/owin-1.0.0.html
- var responseStream = (Stream)environment["owin.ResponseBody"];
- var responseHeaders = (IDictionary<string, string[]>)environment["owin.ResponseHeaders"];
- responseHeaders["Content-Length"] = new string[] { responseBytes.Length.ToString(CultureInfo.InvariantCulture) };
- responseHeaders["Content-Type"] = new string[] { "text/plain" };
- return responseStream.WriteAsync(responseBytes, , responseBytes.Length);
- }
- public void Configure(IApplicationBuilder app)
- {
- app.UseOwin(pipeline =>
- {
- pipeline(next => OwinHello);
- });
- }
- app.UseOwin(pipeline =>
- {
- pipeline(next =>
- {
- // do something before
- return OwinHello;
- // do something after
- });
- });
- -------------------------------------------------------------------------------------------------
- Using ASP.NET Hosting on an OWIN-based server
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net;
- using System.Threading.Tasks;
- using Microsoft.AspNetCore.Hosting.Server;
- using Microsoft.AspNetCore.Hosting.Server.Features;
- using Microsoft.AspNetCore.Http.Features;
- using Microsoft.AspNetCore.Owin;
- using Microsoft.Extensions.Options;
- using Nowin;
- namespace NowinSample
- {
- public class NowinServer : IServer
- {
- private INowinServer _nowinServer;
- private ServerBuilder _builder;
- public IFeatureCollection Features { get; } = new FeatureCollection();
- public NowinServer(IOptions<ServerBuilder> options)
- {
- Features.Set<IServerAddressesFeature>(new ServerAddressesFeature());
- _builder = options.Value;
- }
- public void Start<TContext>(IHttpApplication<TContext> application)
- {
- // Note that this example does not take into account of Nowin's "server.OnSendingHeaders" callback.
- // Ideally we should ensure this method is fired before disposing the context.
- Func<IDictionary<string, object>, Task> appFunc = async env =>
- {
- // The reason for 2 level of wrapping is because the OwinFeatureCollection isn't mutable
- // so features can't be added
- var features = new FeatureCollection(new OwinFeatureCollection(env));
- var context = application.CreateContext(features);
- try
- {
- await application.ProcessRequestAsync(context);
- }
- catch (Exception ex)
- {
- application.DisposeContext(context, ex);
- throw;
- }
- application.DisposeContext(context, null);
- };
- // Add the web socket adapter so we can turn OWIN websockets into ASP.NET Core compatible web sockets.
- // The calling pattern is a bit different
- appFunc = OwinWebSocketAcceptAdapter.AdaptWebSockets(appFunc);
- // Get the server addresses
- var address = Features.Get<IServerAddressesFeature>().Addresses.First();
- var uri = new Uri(address);
- var port = uri.Port;
- IPAddress ip;
- if (!IPAddress.TryParse(uri.Host, out ip))
- {
- ip = IPAddress.Loopback;
- }
- _nowinServer = _builder.SetAddress(ip)
- .SetPort(port)
- .SetOwinApp(appFunc)
- .Build();
- _nowinServer.Start();
- }
- public void Dispose()
- {
- _nowinServer?.Dispose();
- }
- }
- }
- using System;
- using Microsoft.AspNetCore.Hosting.Server;
- using Microsoft.Extensions.DependencyInjection;
- using Nowin;
- using NowinSample;
- namespace Microsoft.AspNetCore.Hosting
- {
- public static class NowinWebHostBuilderExtensions
- {
- public static IWebHostBuilder UseNowin(this IWebHostBuilder builder)
- {
- return builder.ConfigureServices(services =>
- {
- services.AddSingleton<IServer, NowinServer>();
- });
- }
- public static IWebHostBuilder UseNowin(this IWebHostBuilder builder, Action<ServerBuilder> configure)
- {
- builder.ConfigureServices(services =>
- {
- services.Configure(configure);
- });
- return builder.UseNowin();
- }
- }
- }
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Threading.Tasks;
- using Microsoft.AspNetCore.Hosting;
- namespace NowinSample
- {
- public class Program
- {
- public static void Main(string[] args)
- {
- var host = new WebHostBuilder()
- .UseNowin()
- .UseContentRoot(Directory.GetCurrentDirectory())
- .UseIISIntegration()
- .UseStartup<Startup>()
- .Build();
- host.Run();
- }
- }
- }
- ------------------------------------------------------------------------------
- Run ASP.NET Core on an OWIN-based server and use its WebSockets support
- public class Startup
- {
- public void Configure(IApplicationBuilder app)
- {
- app.Use(async (context, next) =>
- {
- if (context.WebSockets.IsWebSocketRequest)
- {
- WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
- await EchoWebSocket(webSocket);
- }
- else
- {
- await next();
- }
- });
- app.Run(context =>
- {
- return context.Response.WriteAsync("Hello World");
- });
- }
- private async Task EchoWebSocket(WebSocket webSocket)
- {
- byte[] buffer = new byte[];
- WebSocketReceiveResult received = await webSocket.ReceiveAsync(
- new ArraySegment<byte>(buffer), CancellationToken.None);
- while (!webSocket.CloseStatus.HasValue)
- {
- // Echo anything we receive
- await webSocket.SendAsync(new ArraySegment<byte>(buffer, , received.Count),
- received.MessageType, received.EndOfMessage, CancellationToken.None);
- received = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer),
- CancellationToken.None);
- }
- await webSocket.CloseAsync(webSocket.CloseStatus.Value,
- webSocket.CloseStatusDescription, CancellationToken.None);
- }
- }
- }
- ------------------------------------------------------------------------------------------------
- OWIN keys
- Request Data (OWIN v1.0.0)
- Key Value (type) Description
- owin.RequestScheme String
- owin.RequestMethod String
- owin.RequestPathBase String
- owin.RequestPath String
- owin.RequestQueryString String
- owin.RequestProtocol String
- owin.RequestHeaders IDictionary<string,string[]>
- owin.RequestBody Stream
- Request Data (OWIN v1.1.0)
- Key Value (type) Description
- owin.RequestId String Optional
- Response Data (OWIN v1.0.0)
- Key Value (type) Description
- owin.ResponseStatusCode int Optional
- owin.ResponseReasonPhrase String Optional
- owin.ResponseHeaders IDictionary<string,string[]>
- owin.ResponseBody Stream
- Other Data (OWIN v1.0.0)
- Key Value (type) Description
- owin.CallCancelled CancellationToken
- owin.Version String
- Common Keys
- Key Value (type) Description
- ssl.ClientCertificate X509Certificate
- ssl.LoadClientCertAsync Func<Task>
- server.RemoteIpAddress String
- server.RemotePort String
- server.LocalIpAddress String
- server.LocalPort String
- server.IsLocal bool
- server.OnSendingHeaders Action<Action<object>,object>
- SendFiles v0.3.0
- Key Value (type) Description
- sendfile.SendAsync See delegate signature Per Request
- Opaque v0.3.0
- Key Value (type) Description
- opaque.Version String
- opaque.Upgrade OpaqueUpgrade See delegate signature
- opaque.Stream Stream
- opaque.CallCancelled CancellationToken
- WebSocket v0.3.0
- Key Value (type) Description
- websocket.Version String
- websocket.Accept WebSocketAccept See delegate signature.
- websocket.AcceptAlt Non-spec
- websocket.SubProtocol String See RFC6455 Section 4.2. Step 5.5
- websocket.SendAsync WebSocketSendAsync See delegate signature.
- websocket.ReceiveAsync WebSocketReceiveAsync See delegate signature.
- websocket.CloseAsync WebSocketCloseAsync See delegate signature.
- websocket.CallCancelled CancellationToken
- websocket.ClientCloseStatus int Optional
- websocket.ClientCloseDescription String Optional
DotNet 学习笔记 OWIN的更多相关文章
- DotNet 学习笔记 Servers
Servers ASP.NET Core ships with two different HTTP servers: •Microsoft.AspNetCore.Server.Kestrel (AK ...
- DotNet 学习笔记 应用状态管理
Application State Options --------------------------------------------------------------------- *Htt ...
- DotNet 学习笔记 MVC模型
Model Binding Below is a list of model binding attributes: •[BindRequired]: This attribute adds a mo ...
- Visual Studio 2015 Owin+MVC+WebAPI+ODataV4+EntityFrawork+Identity+Oauth2.0+AngularJS 1.x 学习笔记
2016年,.net 会有很多大更新 ASP.NET 5 在此之前我都是用着古老的.net做开发的 (WebForm + IIS) 为了接下来应对 .net 的新功能,我特地去学习了一下基本的 MVC ...
- 【工作笔记】BAT批处理学习笔记与示例
BAT批处理学习笔记 一.批注里定义:批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD,这些命令统称批处理命令. 二.常见的批处理指令: 命令清单: 1.RE ...
- Extjs 学习笔记1
学习笔记 目 录 1 ExtJs 4 1.1 常见错误处理 4 1.1.1 多个js文件中有相同的控件,切换时无法正常显示 4 1.1.2 Store的使用方法 4 1.1.3 gridPanel ...
- 黑马程序员-C#学习笔记
---------------------- ASP.Net+Android+IOS开发..Net培训.期待与您交流! ---------------------- C#学习笔记 1..NET/.do ...
- 【C#编程基础学习笔记】6---变量的命名
2013/7/24 技术qq交流群:JavaDream:251572072 教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]6---变量的命名 ----- ...
- ASP.NET Core Web开发学习笔记-1介绍篇
ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...
随机推荐
- CentOS 7 开放防火墙端口
我:最近在使 CentOS 7时发现在本地不能访问linux上8080端口,以上是我的操作,修改后访问成功 CentOS 7 开放防火墙端口 命令 最近公司新的server要求用CentOS7, 发现 ...
- Android基础------高级ul:消息提示
前言:Android消息提示笔记,刚刚接触Android 1.静态方法Toast 直接调用静态方法 //消息提示(context,"内容",固定时间) Toast.makeText ...
- JavaScript Array 类型
除 Object类型外,Array 类型算是ECMAScript中最常用的类型了,而且,ECMAScript中的数组和其他多数语言的数组有着非常大的差别,虽然这些数组都是数据的有序列表,但与其他语言不 ...
- 响应式布局(rem布局),使用JS动态设置fontsize
var cw = document.documentElement.clientWidth; if (cw > 1920) { cw = 1920; } document.getElements ...
- [NOIP2012 TG D2T1]同余方程
题目大意:求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 题解:即求a在mod b意义下的逆元,这里用扩展欧几里得来解决 C++ Code: #include<cstdio ...
- 【CSU1911】Card Game(FWT)
[CSU1911]Card Game(FWT) 题面 vjudge 题目大意: 给定两个含有\(n\)个数的数组 每次询问一个数\(x\),回答在每个数组中各选一个数,或起来之后的结果恰好为\(x\) ...
- TCP中三次握手建立和四次握手释放以及相关问题
本文基于个人所学和网上博文所整理,若有不妥处,欢迎留言指出 TCP连接过程中标志位的意义: 字符缩写 描述 SYN 同步序号,表示此报文是一个连接请求或连接接受报文 ACK 确认位,对接收到的报文的确 ...
- UVA.297 Quadtrees (四分树 DFS)
UVA.297 Quadtrees (四分树 DFS) 题意分析 将一个正方形像素分成4个小的正方形,接着根据字符序列来判断是否继续分成小的正方形表示像素块.字符表示规则是: p表示这个像素块继续分解 ...
- [zhuan]Android 异常处理:java.lang.IllegalArgumentException(...contains a path separator)
http://blog.csdn.net/alex_zhuang/article/details/7340901 对以下错误: Java.lang.RuntimeException: java.lan ...
- 【单调队列】【P1714】 切蛋糕
传送门 Description 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值. 小Z作为寿星,自然希望吃到的第一块蛋糕的幸 ...