.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.RequestHeadersIDictionary <文字列、文字列[]>
owin.RequestBody流れ

データ要求(OWIN v1.1.0)

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

応答データ(OWIN v1.0.0)

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

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

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

共有キー

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

SendFiles v0.3.0

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

不透明v0.3.0

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

WebSocket v0.3.0

キー値(タイプ)説明
websocket.Versionひも
websocket.AcceptWebSocketAccept署名の転送を参照してください
websocket.AcceptAlt指定なし
websocket.SubProtocolひもRFC6455のセクション4.2.2のステップ5.5を参照してください
websocket.SendAsyncWebSocketSendAsync署名の転送を参照してください
websocket.ReceiveAsyncWebSocketReceiveAsync署名の転送を参照してください
websocket.CloseAsyncWebSocketCloseAsync署名の転送を参照してください
websocket.CallCancelledCancellationToken
websocket.ClientCloseStatusintオプショナル
websocket.ClientCloseDescriptionひもオプショナル

追加のリソース


Source: https://habr.com/ru/post/J342900/


All Articles