Open Web Interface for .NET (OWIN) と ASP.NET Core
作成者: Steve Smith、Rick Anderson
ASP.NET Core:
- Open Web Interface for .NET (OWIN) をサポートします。
Microsoft.Owin.*
(Katana) ライブラリの .NET Core と互換性のある置換があります。
OWIN により、Web アプリを Web サーバーから切り離すことが可能になります。 ミドルウェアをパイプラインで使用し、要求と関連する応答を処理するための標準的な方法を定義します。 ASP.NET Core アプリケーションとミドルウェアは、OWIN ベースのアプリケーション、サーバー、およびミドルウェアと相互運用できます。
OWIN には、さまざまなオブジェクト モデルを使用する 2 つのフレームワークを併用できる分離レイヤーがあります。 Microsoft.AspNetCore.Owin
パッケージには 2 つのアダプター実装が用意されています。
- ASP.NET Core から OWIN へ
- OWIN から ASP.NET Core へ
これにより、ASP.NET Core を OWIN 互換のサーバー/ホスト上でホストするか、他の OWIN 互換コンポーネントを ASP.NET Core 上で実行することができます。
Note
これらのアダプターを使用すると、パフォーマンスが低下します。 ASP.NET Core コンポーネントのみを使用するアプリケーションでは、Microsoft.AspNetCore.Owin
パッケージまたはアダプターを使用しないでください。
サンプル コードを表示またはダウンロードします (ダウンロード方法)。
ASP.NET Core パイプラインで OWIN ミドルウェアを実行する
ASP.NET Core の OWIN のサポートは、Microsoft.AspNetCore.Owin
パッケージの一部として展開されます。 このパッケージをインストールすることで、OWIN のサポートをプロジェクトにインポートできます。
OWIN ミドルウェアは、Func<IDictionary<string, object>, Task>
インターフェイスと特定のキー (owin.ResponseBody
など) の設定を必須とする OWIN 仕様に準拠しています。 次の単純な OWIN ミドルウェアを実行すると "Hello World" が表示されます。
public Task OwinHello(IDictionary<string, object> environment)
{
string responseText = "Hello World via OWIN";
byte[] responseBytes = Encoding.UTF8.GetBytes(responseText);
// OWIN Environment Keys: https://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
拡張メソッドを使用して ASP.NET Core パイプラインに OwinHello
ミドルウェア (上の図) を追加する方法を示しています。
public void Configure(IApplicationBuilder app)
{
app.UseOwin(pipeline =>
{
pipeline(next => OwinHello);
});
}
OWIN パイプライン内で実行する他のアクションを構成できます。
Note
応答ヘッダーは、応答ストリームへの最初の書き込み前にのみ変更してください。
Note
パフォーマンス上の理由から、UseOwin
を複数回、呼び出すことは避けてください。 OWIN コンポーネントは、グループ化されている場合に最適に動作します。
app.UseOwin(pipeline =>
{
pipeline(next =>
{
return async environment =>
{
// Do something before.
await next(environment);
// Do something after.
};
});
});
OWIN ベースのサーバー上で ASP.NET Core を実行し、その WebSockets のサポートを利用する
OWIN ベースのサーバーの機能を ASP.NET Core で利用する方法のもう 1 つの例として、WebSockets などの機能へのアクセスが挙げられます。 前の例で使用していた .NET OWIN Web サーバーは、ASP.NET Core アプリケーションから利用できる組み込みの WebSocket をサポートしています。 WebSocket をサポートし、WebSocket を介してサーバーに送信されたすべてをエコー バックする単純な 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);
}
}
OWIN 環境
HttpContext
を使用して OWIN 環境を構築できます。
var environment = new OwinEnvironment(HttpContext);
var features = new OwinFeatureCollection(environment);
OWIN キー
OWIN は、HTTP 要求/応答の交換を通じて情報を伝達するために IDictionary<string,object>
オブジェクトに依存しています。 ASP.NET Core は次のキーを実装しています。 主な仕様、拡張機能に関するセクションと、「OWIN Key Guidelines and Common Keys」(OWIN キーのガイドラインと共通キー) を参照してください。
要求データ (OWIN v1.0.0)
Key | 値 (型) | 説明 |
---|---|---|
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 |
要求データ (OWIN v1.1.0)
Key | 値 (型) | 説明 |
---|---|---|
owin.RequestId | String |
Optional |
応答データ (OWIN v1.0.0)
Key | 値 (型) | 説明 |
---|---|---|
owin.ResponseStatusCode | int |
Optional |
owin.ResponseReasonPhrase | String |
Optional |
owin.ResponseHeaders | IDictionary<string,string[]> |
|
owin.ResponseBody | Stream |
その他のデータ (OWIN v1.0.0)
Key | 値 (型) | 説明 |
---|---|---|
owin.CallCancelled | CancellationToken |
|
owin.Version | String |
共通キー
Key | 値 (型) | 説明 |
---|---|---|
ssl.ClientCertificate | X509Certificate |
|
ssl.LoadClientCertAsync | Func<Task> |
|
server.RemoteIpAddress | String |
|
server.RemotePort | String |
|
server.LocalIpAddress | String |
|
server.LocalPort | String |
|
server.OnSendingHeaders | Action<Action<object>,object> |
SendFiles v0.3.0
Key | 値 (型) | 説明 |
---|---|---|
sendfile.SendAsync | 「Delegate Signature」(デリゲート シグネチャ) を参照してください。 | 要求ごと |
Opaque v0.3.0
Key | 値 (型) | 説明 |
---|---|---|
opaque.Version | String |
|
opaque.Upgrade | OpaqueUpgrade |
「Delegate Signature」(デリゲート シグネチャ) を参照してください。 |
opaque.Stream | Stream |
|
opaque.CallCancelled | CancellationToken |
WebSocket v0.3.0
Key | 値 (型) | 説明 |
---|---|---|
websocket.Version | String |
|
websocket.Accept | WebSocketAccept |
「Delegate Signature」(デリゲート シグネチャ) を参照してください。 |
websocket.AcceptAlt | 記述なし | |
websocket.SubProtocol | String |
RFC6455 のセクション 4.2.2 の手順 5.5 を参照してください。 |
websocket.SendAsync | WebSocketSendAsync |
「Delegate Signature」(デリゲート シグネチャ) を参照してください。 |
websocket.ReceiveAsync | WebSocketReceiveAsync |
「Delegate Signature」(デリゲート シグネチャ) を参照してください。 |
websocket.CloseAsync | WebSocketCloseAsync |
「Delegate Signature」(デリゲート シグネチャ) を参照してください。 |
websocket.CallCancelled | CancellationToken |
|
websocket.ClientCloseStatus | int |
Optional |
websocket.ClientCloseDescription | String |
Optional |
その他の技術情報
- 翻訳レイヤーでサポートされる OWIN キーについては、GitHub のソースを参照してください。
- ミドルウェア
- サーバー
ASP.NET Core