こんにちは、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);
署名サンプルは
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 => {
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) {
このサンプルは、前のサンプルと同じ
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
不透明v0.3.0
キー | 値(タイプ) | 説明 |
---|
opaque.Version | ひも | |
不透明なアップグレード | 不透明アップグレード | 署名の転送を参照してください |
opaque.Stream | 流れ | |
opaque.CallCancelled | CancellationToken | |
WebSocket v0.3.0
追加のリソース