Otevření webového rozhraní pro .NET (OWIN) s ASP.NET Core

Steve Smith a Rick Anderson

ASP.NET Core:

  • Podporuje rozhraní Open Web Interface pro .NET (OWIN).
  • Obsahuje náhrady Microsoft.Owin.* za knihovny (Katana) kompatibilní s .NET Core.

OWIN umožňuje oddělení webových aplikací od webových serverů. Definuje standardní způsob použití middlewaru v kanálu ke zpracování požadavků a přidružených odpovědí. ASP.NET základní aplikace a middleware můžou spolupracovat s aplikacemi, servery a middlewarem založenými na OWIN.

OWIN poskytuje oddělenou vrstvu, která umožňuje použití dvou architektur s různorodými objektovými modely. Balíček Microsoft.AspNetCore.Owin poskytuje dvě implementace adaptérů:

  • ASP.NET Core do OWIN
  • OWIN k ASP.NET Core

To umožňuje hostování ASP.NET Core nad serverem nebo hostitelem kompatibilním s OWIN nebo s jinými kompatibilními komponentami OWIN nad ASP.NET Core.

Poznámka:

Používání těchto adaptérů má náklady na výkon. Aplikace používající pouze ASP.NET základní komponenty by neměly používat Microsoft.AspNetCore.Owin balíčky ani adaptéry.

Zobrazení nebo stažení ukázkového kódu (postup stažení)

Spuštění middlewaru OWIN v kanálu ASP.NET Core

ASP.NET podpora OWIN core se nasadí jako součást Microsoft.AspNetCore.Owin balíčku. Podporu OWIN můžete do projektu importovat instalací tohoto balíčku.

Middleware OWIN odpovídá specifikaci OWIN, která vyžaduje Func<IDictionary<string, object>, Task> rozhraní, a konkrétní klíče se nastavují (například owin.ResponseBody). Následující jednoduchý middleware OWIN zobrazí "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);
}

Ukázkový podpis vrátí Task hodnotu a přijme ji IDictionary<string, object> podle potřeby OWIN.

Následující kód ukazuje, jak pomocí metody rozšíření přidat OwinHello middleware (viz výše) do kanálu UseOwin ASP.NET Core.

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

Můžete nakonfigurovat další akce, které se mají provést v rámci kanálu OWIN.

Poznámka:

Hlavičky odpovědi by se měly upravit pouze před prvním zápisem do streamu odpovědi.

Poznámka:

Z důvodů výkonu UseOwin se nedoporučuje více volání. Komponenty OWIN budou fungovat nejlépe, pokud jsou seskupené dohromady.

app.UseOwin(pipeline =>
{
    pipeline(next =>
    {
        return async environment =>
        {
            // Do something before.
            await next(environment);
            // Do something after.
        };
    });
});

Spusťte ASP.NET Core na serveru založeném na OWIN a použijte podporu pro webSockety.

Dalším příkladem toho, jak mohou být funkce serverů založené na OWIN využívat ASP.NET Core, je přístup k funkcím, jako jsou WebSockets. Webový server .NET OWIN použitý v předchozím příkladu má podporu pro webSockets integrované, což může využít aplikace ASP.NET Core. Následující příklad ukazuje jednoduchou webovou aplikaci, která podporuje WebSockets a vrací vše odeslané na server přes WebSockets.

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

Prostředí OWIN

Můžete vytvořit prostředí OWIN pomocí .HttpContext


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

Klíče OWIN

OWIN závisí na objektu IDictionary<string,object> , který komunikuje s informacemi v rámci výměny požadavků a odpovědí HTTP. ASP.NET Core implementuje níže uvedené klíče. Viz primární specifikace, rozšíření a pokyny pro klíče OWIN a běžné klíče.

Vyžádání dat (OWIN v1.0.0)

Klíč Hodnota (typ) Popis
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

Vyžádání dat (OWIN v1.1.0)

Klíč Hodnota (typ) Popis
owin. ID požadavku String Volitelné

Data odpovědi (OWIN v1.0.0)

Klíč Hodnota (typ) Popis
owin. ResponseStatusCode int Volitelné
owin. ResponseReasonPhrase String Volitelné
owin. ResponseHeaders IDictionary<string,string[]>
owin. ResponseBody Stream

Další data (OWIN v1.0.0)

Klíč Hodnota (typ) Popis
owin. CallCancelled CancellationToken
owin. Verze String

Běžné klíče

Klíč Hodnota (typ) Popis
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

Klíč Hodnota (typ) Popis
sendfile. SendAsync Zobrazit podpis delegáta Na žádost

Neprůhlený v0.3.0

Klíč Hodnota (typ) Popis
neprůhledný. Verze String
neprůhledný. Upgrade OpaqueUpgrade Zobrazit podpis delegáta
neprůhledný. Proud Stream
neprůhledný. CallCancelled CancellationToken

WebSocket v0.3.0

Klíč Hodnota (typ) Popis
websocket. Verze String
websocket. Přijmout WebSocketAccept Zobrazit podpis delegáta
websocket. AcceptAlt Nespecované
websocket. SubProtocol String Viz RFC6455 oddíl 4.2.2 Krok 5.5
websocket. SendAsync WebSocketSendAsync Zobrazit podpis delegáta
websocket. ReceiveAsync WebSocketReceiveAsync Zobrazit podpis delegáta
websocket. CloseAsync WebSocketCloseAsync Zobrazit podpis delegáta
websocket. CallCancelled CancellationToken
websocket. ClientCloseStatus int Volitelné
websocket. ClientCloseDescription String Volitelné

Další materiály

  • Podívejte se na zdroj na GitHubu pro klíče OWIN podporované ve vrstvě překladu.
  • Middleware
  • Servery