Condividi tramite


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

Di Steve Smith e Rick Anderson

ASP.NET Core:

  • Supporta Open Web Interface per .NET (OWIN).
  • Include sostituzioni compatibili con .NET Core per le Microsoft.Owin.* librerie (Katana).

OWIN consente alle app Web di essere disaccoppiate dai server Web. Definisce un modo standard per usare il middleware in una pipeline per gestire le richieste e le risposte associate. Le applicazioni ASP.NET Core e il middleware possono interagire con middleware, server e applicazioni basati su OWIN.

OWIN specifica un livello di disaccoppiamento che consente di usare contemporaneamente due framework con modelli a oggetti diversi. Il pacchetto Microsoft.AspNetCore.Owin offre due implementazioni dell'adattatore:

  • Da ASP.NET Core a OWIN
  • Da OWIN a ASP.NET Core

In questo modo ASP.NET Core può essere ospitato in un server/host compatibile con OWIN o altri componenti compatibili con OWIN possono essere eseguiti su ASP.NET Core.

Nota

L'uso di questi adattatori comporta una riduzione delle prestazioni. Le app che usano solo componenti di ASP.NET Core non devono usare il pacchetto o gli adattatori Microsoft.AspNetCore.Owin.

Visualizzare o scaricare il codice di esempio (come scaricare)

Esecuzione del middleware OWIN nella pipeline ASP.NET Core

Il supporto di OWIN per ASP.NET Core viene distribuito come parte del pacchetto Microsoft.AspNetCore.Owin. Per importare il supporto OWIN nel progetto è necessario installare il pacchetto.

Il middleware OWIN è conforme alla specifica OWIN, che richiede un'interfaccia Func<IDictionary<string, object>, Task> e devono essere impostate chiavi specifiche, ad esempio owin.ResponseBody. Il semplice middleware OWIN illustrato di seguito visualizza "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);
}

La firma di esempio restituisce un oggetto Task e accetta un oggetto IDictionary<string, object> come richiesto da OWIN.

Il codice seguente illustra come aggiungere il middleware OwinHello, illustrato in precedenza, alla pipeline ASP.NET Core con il metodo di estensione UseOwin.

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

È possibile configurare altre azioni da eseguire all'interno della pipeline OWIN.

Nota

Le intestazioni di risposta devono essere modificate solo prima della prima scrittura nel flusso di risposta.

Nota

Le chiamate multiple al metodo UseOwin sono sconsigliate per non compromettere le prestazioni. I componenti OWIN funzionano meglio se raggruppati insieme.

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

Ambiente OWIN

È possibile creare un ambiente OWIN tramite HttpContext.


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

Chiavi OWIN

OWIN dipende da un oggetto IDictionary<string,object> per comunicare informazioni attraverso uno scambio di richiesta/risposta HTTP. ASP.NET Core implementa le chiavi elencate di seguito. Vedere le specifiche principali, le estensioni e le linee guida chiave e le chiavi comuni OWIN.

Dati della richiesta (OWIN versione 1.0.0)

Chiave Valore (tipo) Descrizione
owin. Schema di richiesta String
owin. Metodo RequestMethod String
owin. RequestPathBase String
owin. Percorso di richiesta String
owin. RequestQueryString String
owin. RequestProtocol String
owin. RequestHeaders IDictionary<string,string[]>
owin. Corpo della richiesta Stream

Dati della richiesta (OWIN versione 1.1.0)

Chiave Valore (tipo) Descrizione
owin. RequestId String Facoltativo

Dati della risposta (OWIN versione 1.0.0)

Chiave Valore (tipo) Descrizione
owin. ResponseStatusCode int Facoltativo
owin. ResponseReasonPhrase String Facoltativo
owin. ResponseHeaders IDictionary<string,string[]>
owin. ResponseBody Stream

Altri dati (OWIN versione 1.0.0)

Chiave Valore (tipo) Descrizione
owin. CallCancelled CancellationToken
owin. Versione String

Chiavi comuni

Chiave Valore (tipo) Descrizione
ssl. ClientCertificate X509Certificate
ssl. LoadClientCertAsync Func<Task>
server. RemoteIpAddress String
server. RemotePort String
server. Indirizzo IP locale String
server. Porta locale String
server. OnSendingHeaders Action<Action<object>,object>

SendFiles v0.3.0

Chiave Valore (tipo) Descrizione
sendfile. SendAsync Vedere firma del delegato Per richiesta

Opaco v0.3.0

Chiave Valore (tipo) Descrizione
opaco. Versione String
opaco. Aggiornamento OpaqueUpgrade Vedere firma del delegato
flusso opaco Stream
opaco.ChiamataAnnullata CancellationToken

WebSocket v0.3.0

Chiave Valore (tipo) Descrizione
websocket. Versione String
websocket.Accetta WebSocketAccept Vedere firma del delegato
Websocket. AcceptAlt Non specificata
websocket. Sottoprotocolo String Vedere RFC6455 sezione 4.2.2 Passaggio 5.5
Websocket. SendAsync WebSocketSendAsync Vedere firma del delegato
Websocket. ReceiveAsync WebSocketReceiveAsync Vedere firma del delegato
Websocket. ChiudiAsincrono WebSocketCloseAsync Vedere firma del delegato
websocket.ChiamataAnnullata CancellationToken
Websocket. ClientCloseStatus int Facoltativo
Websocket. ClientCloseDescrizione String Facoltativo

Risorse aggiuntive