Open Web Interface for .NET (OWIN) と ASP.NET Core

作成者: Steve SmithRick 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 アプリケーションから利用できる組み込みの Web Sockets をサポートしています。 Web Sockets をサポートし、WebSockets を介してサーバーに送信されたすべてをエコー バックする単純な 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

その他の技術情報