Dela via


Öppna webbgränssnittet för .NET (OWIN) med ASP.NET Core

Av Steve Smith och Rick Anderson

ASP.NET Core:

  • Stödjer Open Web Interface for .NET (OWIN).
  • Har kompatibla ersättningar för Microsoft.Owin.*Katana-biblioteken.

OWIN tillåter att webbappar frikopplas från webbservrar. Den definierar ett standardsätt för mellanprogram som ska användas i en pipeline för att hantera begäranden och tillhörande svar. ASP.NET Core-program och mellanprogram kan samverka med OWIN-baserade program, servrar och mellanprogram.

OWIN tillhandahåller ett frikopplingslager som gör att två ramverk med olika objektmodeller kan användas tillsammans. Microsoft.AspNetCore.Owin-paketet innehåller två adapterimplementeringar:

  • ASP.NET Core till OWIN
  • OWIN till ASP.NET Core

På så sätt kan ASP.NET Core finnas ovanpå en OWIN-kompatibel server/värd eller för att andra OWIN-kompatibla komponenter ska köras ovanpå ASP.NET Core.

Note

Användning av dessa adaptrar medför en prestandaförlust. Appar som bara använder ASP.NET Core-komponenter ska inte använda Microsoft.AspNetCore.Owin-paketet eller adaptrarna.

Visa eller ladda ned exempelkod (ladda ned)

Köra OWIN-mellanprogram i ASP.NET Core-pipelinen

ASP.NET CoreS OWIN-stöd distribueras som en del av Microsoft.AspNetCore.Owin-paketet. Du kan importera OWIN-stöd till projektet genom att installera det här paketet.

OWIN-mellanprogram överensstämmer med OWIN-specifikationen, som kräver ett Func<IDictionary<string, object>, Task> gränssnitt, och specifika nycklar anges (till exempel owin.ResponseBody). Följande enkla OWIN-mellanprogram visar "Hello World":

public Task OwinHello(IDictionary<string, object> environment)
{
    string responseText = "Hello World via OWIN";
    byte[] responseBytes = Encoding.UTF8.GetBytes(responseText);

    // OWIN Environment Keys: http://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);
}

Exempelsignaturen returnerar en Task och accepterar en IDictionary<string, object> som krävs av OWIN.

Följande kod visar hur du lägger till OwinHello mellanprogram (visas ovan) i ASP.NET Core-pipelinen med UseOwin-tilläggsmetoden.

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

Du kan konfigurera andra åtgärder som ska utföras i OWIN-pipelinen.

Note

Responsrubriker ska bara ändras innan den första skrivningen till responsströmmen.

Note

Flera anrop till UseOwin avråds för prestandaskäl. OWIN-komponenter fungerar bäst om de grupperas tillsammans.

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

OWIN-miljö

Du kan skapa en OWIN-miljö med hjälp av HttpContext.


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

OWIN-nycklar

OWIN är beroende av ett IDictionary<string,object> objekt för att kommunicera information i ett HTTP-begäran/svar-utbyte. ASP.NET Core implementerar nycklarna som anges nedan. Se den primära specifikationen, tilläggen och OWIN-nyckelriktlinjerna och Vanliga nycklar.

Begär data (OWIN v1.0.0)

Key Värde (typ) Description
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

Begär data (OWIN v1.1.0)

Key Värde (typ) Description
owin.RequestId String Optional

Svarsdata (OWIN v1.0.0)

Key Värde (typ) Description
owin.ResponseStatusCode int Optional
owin.ResponseReasonPhrase String Optional
owin.ResponseHeaders IDictionary<string,string[]>
owin.ResponseBody Stream

Andra data (OWIN v1.0.0)

Key Värde (typ) Description
owin.CallCancelled CancellationToken
owin.Version String

Vanliga nycklar

Key Värde (typ) Description
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 Värde (typ) Description
sendfile.SendAsync Se ombudssignatur Per begäran

Ogenomskinlig v0.3.0

Key Värde (typ) Description
opaque.Version String
opaque.Upgrade OpaqueUpgrade Se ombudssignatur
opaque.Stream Stream
opaque.CallCancelled CancellationToken

WebSocket v0.3.0

Key Värde (typ) Description
websocket.Version String
websocket.Accept WebSocketAccept Se ombudssignatur
websocket.AcceptAlt Non-spec
websocket.SubProtocol String Se RFC6455 avsnitt 4.2.2 Steg 5.5
websocket.SendAsync WebSocketSendAsync Se ombudssignatur
websocket.ReceiveAsync WebSocketReceiveAsync Se ombudssignatur
websocket.CloseAsync WebSocketCloseAsync Se ombudssignatur
websocket.CallCancelled CancellationToken
websocket.ClientCloseStatus int Optional
websocket.ClientCloseDescription String Optional

Ytterligare resurser