Delen via


Open Web Interface voor .NET (OWIN) met ASP.NET Core

Door Steve Smith en Rick Anderson

ASP.NET Core:

  • Ondersteunt de Open Web Interface voor .NET (OWIN).
  • Bevat .NET Core-compatibele vervangingen voor de Microsoft.Owin.* (Katana-) bibliotheken.

Met OWIN kunnen web-apps worden losgekoppeld van webservers. Het definieert een standaardmethode voor middleware die in een pijplijn moet worden gebruikt om aanvragen en bijbehorende antwoorden te verwerken. ASP.NET Core-toepassingen en middleware kunnen samenwerken met OWIN-toepassingen, servers en middleware.

OWIN biedt een ontkoppelingslaag waarmee twee frameworks met verschillende objectmodellen samen kunnen worden gebruikt. Het Microsoft.AspNetCore.Owin-pakket biedt twee adapter-implementaties:

  • ASP.NET Core naar OWIN
  • OWIN naar ASP.NET Core

Hierdoor kan ASP.NET Core worden gehost boven op een OWIN-compatibele server/host of voor andere OWIN-compatibele onderdelen die boven op ASP.NET Core worden uitgevoerd.

Notitie

Het gebruik van deze adapters heeft een prestatieverlies. Apps die alleen ASP.NET Core-onderdelen gebruiken, mogen het Microsoft.AspNetCore.Owin pakket of adapters niet gebruiken.

Voorbeeldcode bekijken of downloaden (hoe te downloaden)

OWIN-middleware uitvoeren in de ASP.NET Core-pijplijn

de OWIN-ondersteuning van ASP.NET Core wordt geïmplementeerd als onderdeel van het Microsoft.AspNetCore.Owin-pakket. U kunt OWIN-ondersteuning importeren in uw project door dit pakket te installeren.

OWIN middleware voldoet aan de OWIN-specificatie, waarvoor een Func<IDictionary<string, object>, Task> interface is vereist en specifieke sleutels moeten worden ingesteld (zoals owin.ResponseBody). In de volgende eenvoudige OWIN-middleware wordt 'Hallo wereld' weergegeven:

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

De voorbeeldhandtekening retourneert een Task en accepteert een IDictionary<string, object> zoals vereist door OWIN.

De volgende code laat zien hoe u de OwinHello middleware (hierboven) toevoegt aan de ASP.NET Core-pijplijn met de UseOwin-extensiemethode.

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

U kunt andere acties configureren die plaatsvinden in de OWIN-pijplijn.

Notitie

Antwoordheaders mogen alleen worden gewijzigd voordat de eerste schrijfbewerking naar de antwoordstroom wordt uitgevoerd.

Notitie

Meerdere aanroepen naar UseOwin worden om prestatieredenen afgeraden. OWIN-onderdelen werken het beste als ze zijn gegroepeerd.

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

OWIN-omgeving

U kunt een OWIN-omgeving maken met behulp van de HttpContext.


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

OWIN-sleutels

OWIN is afhankelijk van een IDictionary<string,object>-object om informatie over te brengen in een HTTP-aanvraag-/antwoorduitwisseling. ASP.NET Core implementeert de onderstaande sleutels. Zie de primaire specificatie, extensiesen OWIN-sleutelrichtlijnen en algemene sleutels.

Gegevens aanvragen (OWIN v1.0.0)

Sleutel Waarde (type) Beschrijving
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

Aanvraaggegevens (OWIN v1.1.0)

Sleutel Waarde (type) Beschrijving
owin.RequestId String Facultatief

Antwoordgegevens (OWIN v1.0.0)

Sleutel Waarde (type) Beschrijving
owin. ResponseStatusCode int Facultatief
owin. ResponseReasonPhrase String Facultatief
owin. ResponseHeaders IDictionary<string,string[]>
owin. ResponseBody Stream

Overige gegevens (OWIN v1.0.0)

Sleutel Waarde (type) Beschrijving
owin. CallCancelled CancellationToken
owin.Versie String

Algemene sleutels

Sleutel Waarde (type) Beschrijving
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

Sleutel Waarde (type) Beschrijving
sendfile.SendAsync Zie gedelegeerde handtekening Op verzoek

Opaque v0.3.0

Sleutel Waarde (type) Beschrijving
ondoorzichtig. Versie String
ondoorzichtig. Opwaarderen OpaqueUpgrade Zie gedelegeerde handtekening
ondoorzichtig. Stroom Stream
Onverzichtelijk.OproepGeannuleerd CancellationToken

WebSocket v0.3.0

Sleutel Waarde (type) Beschrijving
websocket. Versie String
websocket. Accepteren WebSocketAccept Zie handtekening van gedelegeerde
websocket.AcceptAlt Niet-specifiek
websocket.SubProtocol String Zie RFC6455 sectie 4.2.2 stap 5.5
websocket.SendAsync WebSocketSendAsync Zie handtekening van gedelegeerde
websocket.ReceiveAsync WebSocketReceiveAsync Zie handtekening van de afgevaardigde
websocket.CloseAsync WebSocketCloseAsync Zie handtekening van gedelegeerde
websocket. CallCancelled CancellationToken
websocket.ClientCloseStatus int Facultatief
websocket.ClientCloseDescription String Facultatief

Aanvullende informatiebronnen