1. Open Web Interface for .NET (OWIN)
  2.  
  3. -------------------------------------------------------------------------
  4. Running OWIN middleware in the ASP.NET pipeline
  5. "dependencies": {
  6. "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0",
  7. "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
  8. "Microsoft.AspNetCore.Owin": "1.0.0"
  9. },
  10.  
  11. public Task OwinHello(IDictionary<string, object> environment)
  12. {
  13. string responseText = "Hello World via OWIN";
  14. byte[] responseBytes = Encoding.UTF8.GetBytes(responseText);
  15.  
  16. // OWIN Environment Keys: http://owin.org/spec/spec/owin-1.0.0.html
  17. var responseStream = (Stream)environment["owin.ResponseBody"];
  18. var responseHeaders = (IDictionary<string, string[]>)environment["owin.ResponseHeaders"];
  19.  
  20. responseHeaders["Content-Length"] = new string[] { responseBytes.Length.ToString(CultureInfo.InvariantCulture) };
  21. responseHeaders["Content-Type"] = new string[] { "text/plain" };
  22.  
  23. return responseStream.WriteAsync(responseBytes, , responseBytes.Length);
  24. }
  25.  
  26. public void Configure(IApplicationBuilder app)
  27. {
  28. app.UseOwin(pipeline =>
  29. {
  30. pipeline(next => OwinHello);
  31. });
  32. }
  33. app.UseOwin(pipeline =>
  34. {
  35. pipeline(next =>
  36. {
  37. // do something before
  38. return OwinHello;
  39. // do something after
  40. });
  41. });
  42. -------------------------------------------------------------------------------------------------
  43. Using ASP.NET Hosting on an OWIN-based server
  44.  
  45. using System;
  46. using System.Collections.Generic;
  47. using System.Linq;
  48. using System.Net;
  49. using System.Threading.Tasks;
  50. using Microsoft.AspNetCore.Hosting.Server;
  51. using Microsoft.AspNetCore.Hosting.Server.Features;
  52. using Microsoft.AspNetCore.Http.Features;
  53. using Microsoft.AspNetCore.Owin;
  54. using Microsoft.Extensions.Options;
  55. using Nowin;
  56.  
  57. namespace NowinSample
  58. {
  59. public class NowinServer : IServer
  60. {
  61. private INowinServer _nowinServer;
  62. private ServerBuilder _builder;
  63.  
  64. public IFeatureCollection Features { get; } = new FeatureCollection();
  65.  
  66. public NowinServer(IOptions<ServerBuilder> options)
  67. {
  68. Features.Set<IServerAddressesFeature>(new ServerAddressesFeature());
  69. _builder = options.Value;
  70. }
  71.  
  72. public void Start<TContext>(IHttpApplication<TContext> application)
  73. {
  74. // Note that this example does not take into account of Nowin's "server.OnSendingHeaders" callback.
  75. // Ideally we should ensure this method is fired before disposing the context.
  76. Func<IDictionary<string, object>, Task> appFunc = async env =>
  77. {
  78. // The reason for 2 level of wrapping is because the OwinFeatureCollection isn't mutable
  79. // so features can't be added
  80. var features = new FeatureCollection(new OwinFeatureCollection(env));
  81.  
  82. var context = application.CreateContext(features);
  83. try
  84. {
  85. await application.ProcessRequestAsync(context);
  86. }
  87. catch (Exception ex)
  88. {
  89. application.DisposeContext(context, ex);
  90. throw;
  91. }
  92.  
  93. application.DisposeContext(context, null);
  94. };
  95.  
  96. // Add the web socket adapter so we can turn OWIN websockets into ASP.NET Core compatible web sockets.
  97. // The calling pattern is a bit different
  98. appFunc = OwinWebSocketAcceptAdapter.AdaptWebSockets(appFunc);
  99.  
  100. // Get the server addresses
  101. var address = Features.Get<IServerAddressesFeature>().Addresses.First();
  102.  
  103. var uri = new Uri(address);
  104. var port = uri.Port;
  105. IPAddress ip;
  106. if (!IPAddress.TryParse(uri.Host, out ip))
  107. {
  108. ip = IPAddress.Loopback;
  109. }
  110.  
  111. _nowinServer = _builder.SetAddress(ip)
  112. .SetPort(port)
  113. .SetOwinApp(appFunc)
  114. .Build();
  115. _nowinServer.Start();
  116. }
  117.  
  118. public void Dispose()
  119. {
  120. _nowinServer?.Dispose();
  121. }
  122. }
  123. }
  124.  
  125. using System;
  126. using Microsoft.AspNetCore.Hosting.Server;
  127. using Microsoft.Extensions.DependencyInjection;
  128. using Nowin;
  129. using NowinSample;
  130.  
  131. namespace Microsoft.AspNetCore.Hosting
  132. {
  133. public static class NowinWebHostBuilderExtensions
  134. {
  135. public static IWebHostBuilder UseNowin(this IWebHostBuilder builder)
  136. {
  137. return builder.ConfigureServices(services =>
  138. {
  139. services.AddSingleton<IServer, NowinServer>();
  140. });
  141. }
  142.  
  143. public static IWebHostBuilder UseNowin(this IWebHostBuilder builder, Action<ServerBuilder> configure)
  144. {
  145. builder.ConfigureServices(services =>
  146. {
  147. services.Configure(configure);
  148. });
  149. return builder.UseNowin();
  150. }
  151. }
  152. }
  153.  
  154. using System;
  155. using System.Collections.Generic;
  156. using System.IO;
  157. using System.Linq;
  158. using System.Threading.Tasks;
  159. using Microsoft.AspNetCore.Hosting;
  160.  
  161. namespace NowinSample
  162. {
  163. public class Program
  164. {
  165. public static void Main(string[] args)
  166. {
  167. var host = new WebHostBuilder()
  168. .UseNowin()
  169. .UseContentRoot(Directory.GetCurrentDirectory())
  170. .UseIISIntegration()
  171. .UseStartup<Startup>()
  172. .Build();
  173.  
  174. host.Run();
  175. }
  176. }
  177. }
  178.  
  179. ------------------------------------------------------------------------------
  180. Run ASP.NET Core on an OWIN-based server and use its WebSockets support
  181. public class Startup
  182. {
  183. public void Configure(IApplicationBuilder app)
  184. {
  185. app.Use(async (context, next) =>
  186. {
  187. if (context.WebSockets.IsWebSocketRequest)
  188. {
  189. WebSocket webSocket = await context.WebSockets.AcceptWebSocketAsync();
  190. await EchoWebSocket(webSocket);
  191. }
  192. else
  193. {
  194. await next();
  195. }
  196. });
  197.  
  198. app.Run(context =>
  199. {
  200. return context.Response.WriteAsync("Hello World");
  201. });
  202. }
  203.  
  204. private async Task EchoWebSocket(WebSocket webSocket)
  205. {
  206. byte[] buffer = new byte[];
  207. WebSocketReceiveResult received = await webSocket.ReceiveAsync(
  208. new ArraySegment<byte>(buffer), CancellationToken.None);
  209.  
  210. while (!webSocket.CloseStatus.HasValue)
  211. {
  212. // Echo anything we receive
  213. await webSocket.SendAsync(new ArraySegment<byte>(buffer, , received.Count),
  214. received.MessageType, received.EndOfMessage, CancellationToken.None);
  215.  
  216. received = await webSocket.ReceiveAsync(new ArraySegment<byte>(buffer),
  217. CancellationToken.None);
  218. }
  219.  
  220. await webSocket.CloseAsync(webSocket.CloseStatus.Value,
  221. webSocket.CloseStatusDescription, CancellationToken.None);
  222. }
  223. }
  224. }
  225. ------------------------------------------------------------------------------------------------
  226. OWIN keys
  227. Request Data (OWIN v1.0.0)
  228.  
  229. Key Value (type) Description
  230. owin.RequestScheme String
  231. owin.RequestMethod String
  232. owin.RequestPathBase String
  233. owin.RequestPath String
  234. owin.RequestQueryString String
  235. owin.RequestProtocol String
  236. owin.RequestHeaders IDictionary<string,string[]>
  237. owin.RequestBody Stream
  238.  
  239. Request Data (OWIN v1.1.0)
  240.  
  241. Key Value (type) Description
  242. owin.RequestId String Optional
  243.  
  244. Response Data (OWIN v1.0.0)
  245.  
  246. Key Value (type) Description
  247. owin.ResponseStatusCode int Optional
  248. owin.ResponseReasonPhrase String Optional
  249. owin.ResponseHeaders IDictionary<string,string[]>
  250. owin.ResponseBody Stream
  251.  
  252. Other Data (OWIN v1.0.0)
  253.  
  254. Key Value (type) Description
  255. owin.CallCancelled CancellationToken
  256. owin.Version String
  257.  
  258. Common Keys
  259.  
  260. Key Value (type) Description
  261. ssl.ClientCertificate X509Certificate
  262. ssl.LoadClientCertAsync Func<Task>
  263. server.RemoteIpAddress String
  264. server.RemotePort String
  265. server.LocalIpAddress String
  266. server.LocalPort String
  267. server.IsLocal bool
  268. server.OnSendingHeaders Action<Action<object>,object>
  269.  
  270. SendFiles v0.3.0
  271.  
  272. Key Value (type) Description
  273. sendfile.SendAsync See delegate signature Per Request
  274.  
  275. Opaque v0.3.0
  276.  
  277. Key Value (type) Description
  278. opaque.Version String
  279. opaque.Upgrade OpaqueUpgrade See delegate signature
  280. opaque.Stream Stream
  281. opaque.CallCancelled CancellationToken
  282.  
  283. WebSocket v0.3.0
  284.  
  285. Key Value (type) Description
  286. websocket.Version String
  287. websocket.Accept WebSocketAccept See delegate signature.
  288. websocket.AcceptAlt Non-spec
  289. websocket.SubProtocol String See RFC6455 Section 4.2. Step 5.5
  290. websocket.SendAsync WebSocketSendAsync See delegate signature.
  291. websocket.ReceiveAsync WebSocketReceiveAsync See delegate signature.
  292. websocket.CloseAsync WebSocketCloseAsync See delegate signature.
  293. websocket.CallCancelled CancellationToken
  294. websocket.ClientCloseStatus int Optional
  295. websocket.ClientCloseDescription String Optional

DotNet 学习笔记 OWIN的更多相关文章

  1. DotNet 学习笔记 Servers

    Servers ASP.NET Core ships with two different HTTP servers: •Microsoft.AspNetCore.Server.Kestrel (AK ...

  2. DotNet 学习笔记 应用状态管理

    Application State Options --------------------------------------------------------------------- *Htt ...

  3. DotNet 学习笔记 MVC模型

    Model Binding Below is a list of model binding attributes: •[BindRequired]: This attribute adds a mo ...

  4. Visual Studio 2015 Owin+MVC+WebAPI+ODataV4+EntityFrawork+Identity+Oauth2.0+AngularJS 1.x 学习笔记

    2016年,.net 会有很多大更新 ASP.NET 5 在此之前我都是用着古老的.net做开发的 (WebForm + IIS) 为了接下来应对 .net 的新功能,我特地去学习了一下基本的 MVC ...

  5. 【工作笔记】BAT批处理学习笔记与示例

    BAT批处理学习笔记 一.批注里定义:批处理文件是将一系列命令按一定的顺序集合为一个可执行的文本文件,其扩展名为BAT或者CMD,这些命令统称批处理命令. 二.常见的批处理指令: 命令清单: 1.RE ...

  6. Extjs 学习笔记1

    学习笔记 目   录 1 ExtJs 4 1.1 常见错误处理 4 1.1.1 多个js文件中有相同的控件,切换时无法正常显示 4 1.1.2 Store的使用方法 4 1.1.3 gridPanel ...

  7. 黑马程序员-C#学习笔记

    ---------------------- ASP.Net+Android+IOS开发..Net培训.期待与您交流! ---------------------- C#学习笔记 1..NET/.do ...

  8. 【C#编程基础学习笔记】6---变量的命名

    2013/7/24 技术qq交流群:JavaDream:251572072  教程下载,在线交流:创梦IT社区:www.credream.com [C#编程基础学习笔记]6---变量的命名 ----- ...

  9. ASP.NET Core Web开发学习笔记-1介绍篇

    ASP.NET Core Web开发学习笔记-1介绍篇 给大家说声报歉,从2012年个人情感破裂的那一天,本人的51CTO,CnBlogs,Csdn,QQ,Weboo就再也没有更新过.踏实的生活(曾辞 ...

随机推荐

  1. CentOS 7 开放防火墙端口

    我:最近在使 CentOS 7时发现在本地不能访问linux上8080端口,以上是我的操作,修改后访问成功 CentOS 7 开放防火墙端口 命令 最近公司新的server要求用CentOS7, 发现 ...

  2. Android基础------高级ul:消息提示

    前言:Android消息提示笔记,刚刚接触Android 1.静态方法Toast 直接调用静态方法 //消息提示(context,"内容",固定时间) Toast.makeText ...

  3. JavaScript Array 类型

    除 Object类型外,Array 类型算是ECMAScript中最常用的类型了,而且,ECMAScript中的数组和其他多数语言的数组有着非常大的差别,虽然这些数组都是数据的有序列表,但与其他语言不 ...

  4. 响应式布局(rem布局),使用JS动态设置fontsize

    var cw = document.documentElement.clientWidth; if (cw > 1920) { cw = 1920; } document.getElements ...

  5. [NOIP2012 TG D2T1]同余方程

    题目大意:求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 题解:即求a在mod b意义下的逆元,这里用扩展欧几里得来解决 C++ Code: #include<cstdio ...

  6. 【CSU1911】Card Game(FWT)

    [CSU1911]Card Game(FWT) 题面 vjudge 题目大意: 给定两个含有\(n\)个数的数组 每次询问一个数\(x\),回答在每个数组中各选一个数,或起来之后的结果恰好为\(x\) ...

  7. TCP中三次握手建立和四次握手释放以及相关问题

    本文基于个人所学和网上博文所整理,若有不妥处,欢迎留言指出 TCP连接过程中标志位的意义: 字符缩写 描述 SYN 同步序号,表示此报文是一个连接请求或连接接受报文 ACK 确认位,对接收到的报文的确 ...

  8. UVA.297 Quadtrees (四分树 DFS)

    UVA.297 Quadtrees (四分树 DFS) 题意分析 将一个正方形像素分成4个小的正方形,接着根据字符序列来判断是否继续分成小的正方形表示像素块.字符表示规则是: p表示这个像素块继续分解 ...

  9. [zhuan]Android 异常处理:java.lang.IllegalArgumentException(...contains a path separator)

    http://blog.csdn.net/alex_zhuang/article/details/7340901 对以下错误: Java.lang.RuntimeException: java.lan ...

  10. 【单调队列】【P1714】 切蛋糕

    传送门 Description 今天是小Z的生日,同学们为他带来了一块蛋糕.这块蛋糕是一个长方体,被用不同色彩分成了N个相同的小块,每小块都有对应的幸运值. 小Z作为寿星,自然希望吃到的第一块蛋糕的幸 ...