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

Steve Smith a Rick Anderson

ASP.NET Core:

  • Podporuje rozhraní OWIN (Open Web Interface for .NET).
  • Má náhradu za knihovny Microsoft.Owin.* (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 Core a middleware může spolupracovat s aplikacemi, servery a middlewarem založenými na OWIN.

OWIN poskytuje oddělenou vrstvu, která umožňuje používat dvě architektury s různorodé objektové modely společně. Balíček Microsoft.AspNetCore.Owin poskytuje dvě implementace adaptéru:

  • ASP.NET Core do OWIN
  • Z OWIN do ASP.NET Core

To umožňuje ASP.NET Core, aby se hostoval nad serverem nebo hostitelem kompatibilním s OWIN nebo aby se ostatní komponenty kompatibilní s OWIN spouštěl nad ASP.NET Core.

Poznámka

Používání těchto adaptérů má náklady na výkon. Aplikace, které ASP.NET komponenty Core, by neměly balíček Microsoft.AspNetCore.Owin ani adaptéry používat.

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

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

ASP.NET součástí balíčku je podpora OWIN Microsoft.AspNetCore.Owin core. Podporu OWIN můžete do svého projektu importovat instalací tohoto balíčku.

Middleware OWIN odpovídá specifikaci OWIN, která vyžaduje rozhraní, a musí být nastaveny konkrétní klíče Func<IDictionary<string, object>, Task> (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);
}

Vzorový podpis vrátí a Task přijímá , jak vyžaduje IDictionary<string, object> OWIN.

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

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

Můžete nakonfigurovat další akce, které se budou provádět v rámci kanálu OWIN.

Poznámka

Hlavičky odpovědi by měly být změněny pouze před prvním zápisem do datového proudu odpovědi.

Poznámka

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

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

Spuštění ASP.NET Core na serveru založeném na OWIN a použití jeho podpory webSocketů

Dalším příkladem toho, jak lze funkce serverů založených na OWIN využít ASP.NET Core, je přístup k funkcím, jako jsou WebSockety. Webový server .NET OWIN použitý v předchozím příkladu má integrovanou podporu webových soketů, kterou může využít aplikace ASP.NET Core. Následující příklad ukazuje jednoduchou webovou aplikaci, která podporuje webové sokety a vrací všechno odeslané na server prostřednictvím protokolu WebSocket.

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

Prostředí OWIN můžete vytvořit pomocí HttpContext .


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

Klíče OWIN

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

Data požadavku (OWIN v1.0.0)

Klíč Hodnota (typ) Description
Owin. RequestScheme String
Owin. RequestMethod String
Owin. RequestPathBase String
Owin. RequestPath String
Owin. RequestQueryString String
Owin. RequestProtocol String
Owin. RequestHeaders hostitele IDictionary<string,string[]>
Owin. Částmi Stream

Data požadavku (OWIN v 1.1.0)

Klíč Hodnota (typ) Description
Owin. Identifikátor String Volitelné

Data odpovědi (OWIN v 1.0.0)

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

Jiná data (OWIN v 1.0.0)

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

Běžné klíče

Klíč Hodnota (typ) Description
Ssl. Certifikát klienta X509Certificate
Ssl. LoadClientCertAsync Func<Task>
Server. Vzdálená IP adresa String
Server. Vzdálený port String
Server. LocalIpAddress String
Server. Místní port String
Server. IsLocal bool
Server. OnSendingHeaders Action<Action<object>,object>

SendFiles v0.3.0

Klíč Hodnota (typ) Description
sendfile. Sendasync Viz podpis delegáta. Na požadavek

Neprůhledné v0.3.0

Klíč Hodnota (typ) Description
Neprůhledné. Verze String
Neprůhledné. Upgrade OpaqueUpgrade Viz podpis delegáta.
Neprůhledné. Proudu Stream
Neprůhledné. CallCancelled CancellationToken

WebSocket v0.3.0

Klíč Hodnota (typ) Description
websocket. Verze String
websocket. Přijmout WebSocketAccept Viz podpis delegáta.
websocket. AcceptAlt Jiné než specifikace
websocket. Dílčíprotokol String Viz RFC6455 Section 4.2.2 Step 5.5
websocket. Sendasync WebSocketSendAsync Viz podpis delegáta.
websocket. ReceiveAsync WebSocketReceiveAsync Viz podpis delegáta.
websocket. CloseAsync WebSocketCloseAsync Viz podpis delegáta.
websocket. CallCancelled CancellationToken
websocket. ClientCloseStatus int Volitelné
protokolu WebSocket. ClientCloseDescription String Volitelné

Další zdroje informací