.NET(OWIN)用のオープンWebインターフェイス

こんにちは、Habr! ASP.NET Coreは.NET(OWIN)のオープンWebインターフェイスをサポートし、OWINを使用すると、WebサーバーからWebアプリケーションを解放できます。 要求および対応する応答の処理でミドルウェアを使用する標準的な方法を定義します。 ASP.NET Coreアプリケーションとミドルウェアは、OWINベースのアプリケーション、サーバー、およびミドルウェアと互換性があります。 このペアの詳細については、こちらをご覧ください。







サンプルコードを表示またはダウンロードする



ASP.NETプロセスでのミドルウェアの実行



ASP.NET CoreのOWINサポートは、 Microsoft.AspNetCore.Owin



パッケージの一部として展開されてMicrosoft.AspNetCore.Owin



ます。 OWINサポートをプロジェクトにインポートするには、パッケージを依存関係としてproject.json



ファイルに追加します。



 "dependencies": { "Microsoft.AspNetCore.Server.IISIntegration": "1.0.0", "Microsoft.AspNetCore.Server.Kestrel": "1.0.0", "Microsoft.AspNetCore.Owin": "1.0.0" },
      
      





OWINミドルウェアは、OWIN仕様に準拠しています。OWIN仕様では、 Func<IDictionary<string, object>, Task>



インターフェースの使用と特定のキー( owin.ResponseBody



)の構成が必要です。 以下は、Hello Worldテキストを表示するOWINミドルウェアの例です。



 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, 0, responseBytes.Length); }
      
      





署名サンプルはTask



を発行し、OWIN要件に従ってIDictionary<string, object>



を受け入れます。



次のコードは、 UseOwin



拡張UseOwin



を使用して、 UseOwin



OwinHello



(上記を参照)をASP.NETプロセスに追加する方法を示しています。



 public void Configure(IApplicationBuilder app) { app.UseOwin(pipeline => { pipeline(next => OwinHello); }); }
      
      





OWINプロセスに対して他のアクションを構成できます。



応答ヘッダーは、応答ストリームへの最初のエントリの前にのみ変更する必要があります。



UseOwi



nを何度も呼び出す必要はありません。これによりパフォーマンスが低下します。 OWINコンポーネントを組み合わせると、より適切に機能します。



 app.UseOwin(pipeline => { pipeline(next => { // do something before return OwinHello; // do something after }); });
      
      





OWINサーバーでのASP.NETホスティング



OWINサーバー ASP.NETアプリケーションホストできます。 そのようなサーバーの1つが、.NET OWIN WebサーバーであるNowinです。 この記事の例として、Nowinを参照し、それを使用してASP.NET Coreを単独でホストできるIServer



を作成するプロジェクトを追加しました。



 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(); } } }
      
      





IServer



は、 Features



プロパティとStart



メソッドを必要とするインターフェイスです。



Start



は、サーバーのセットアップと起動を担当します。 これを行うには、IServerAddressesFeatureから解析されたアドレスを構成する一連のAPI呼び出しを使用します。 注: _builder



変数の構成は、メソッドで以前に構成されたappFunc



パラメーターによって要求が処理されることを示しています。 この関数は、リクエストごとに呼び出され、着信リクエストを処理します。



IWebHostBuilder



拡張機能も追加して、Nowinサーバーの追加と構成を容易にします。



 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(); } } }
      
      





次に、Program.csの拡張機能を呼び出して、このユーザーサーバーを使用してASP.NETアプリケーションを実行する必要があります。



 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(); } } }
      
      





ASP.NET サーバーの詳細をご覧ください



OWINサーバーでASP.NET Coreを実行し、WebSocketsサポートを使用します



ASP.NET CoreでOWINサーバーを使用する別の方法は、WebSocketsなどの機能にアクセスすることです。 前の例の.NET OWIN Webサーバーは、ASP.NET Coreアプリケーションで使用できる埋め込みWebソケットをサポートしています。 以下の例は、Webソケットをサポートし、Webソケットを介してサーバーに送信されたすべてのデータを送信者に返す単純なWebアプリケーションを示しています。



 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[1024]; 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, 0, 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); } }
      
      





このサンプルは、前のサンプルと同じNowinServer



を使用して構成されています。 唯一の違いは、 Configure



メソッドでのアプリケーションのConfigure



方法です。 単純なWebソケットクライアントを使用したテストは、アプリケーションを示しています。







OWIN環境



OWIN環境は、 HttpContext



を使用して作成できます。



 var environment = new OwinEnvironment(HttpContext); var features = new OwinFeatureCollection(environment);
      
      





OWINキー



HTTP要求/応答OWIN交換を介して情報を転送するには、 IDictionary<string,object>



オブジェクトがIDictionary<string,object>



。 ASP.NET Coreは、以下にリストされているキーを実装します。 基本仕様 、拡張機能、およびOWINの一般規則を参照してください



データ要求(OWIN v1.0.0)

キー 値(タイプ) 説明
owin.RequestScheme ひも
owin.RequestMethod ひも
owin.RequestPathBase ひも
owin.RequestPath ひも
owin.RequestQueryString ひも
owin.RequestProtocol ひも
owin.RequestHeaders IDictionary <文字列、文字列[]>
owin.RequestBody 流れ

データ要求(OWIN v1.1.0)

キー 値(タイプ) 説明
owin.RequestId ひも オプショナル

応答データ(OWIN v1.0.0)

キー 値(タイプ) 説明
owin.ResponseStatusCode int オプショナル
owin.ResponseReasonPhrase ひも オプショナル
owin.ResponseHeaders IDictionary <文字列、文字列[]>
owin.ResponseBody 流れ

その他のデータ(OWIN v1.0.0)

キー 値(タイプ) 説明
owin.CallCancelled CancellationToken
owin.Version ひも

共有キー

キー 値(タイプ) 説明
ssl.ClientCertificate X509Certificate
ssl.LoadClientCertAsync ファンクタスク
server.RemoteIpAddress ひも
server.RemotePort ひも
server.LocalIpAddress ひも
server.LocalPort ひも
server.IsLocal ブール
server.OnSendingHeaders ActionActionobject、オブジェクト


SendFiles v0.3.0

キー 値(タイプ) 説明
sendfile.SendAsync 署名の転送を参照してください リクエストに応じて


不透明v0.3.0

キー 値(タイプ) 説明
opaque.Version ひも
不透明なアップグレード 不透明アップグレード 署名の転送を参照してください
opaque.Stream 流れ
opaque.CallCancelled CancellationToken


WebSocket v0.3.0

キー 値(タイプ) 説明
websocket.Version ひも
websocket.Accept WebSocketAccept 署名の転送を参照してください
websocket.AcceptAlt 指定なし
websocket.SubProtocol ひも RFC6455のセクション4.2.2のステップ5.5を参照してください
websocket.SendAsync WebSocketSendAsync 署名の転送を参照してください
websocket.ReceiveAsync WebSocketReceiveAsync 署名の転送を参照してください
websocket.CloseAsync WebSocketCloseAsync 署名の転送を参照してください
websocket.CallCancelled CancellationToken
websocket.ClientCloseStatus int オプショナル
websocket.ClientCloseDescription ひも オプショナル


追加のリソース






All Articles