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 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.

Note

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.

Note

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

Note

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)

Key Valore (tipo) 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

Dati della richiesta (OWIN versione 1.1.0)

Key Valore (tipo) Description
owin.RequestId String Optional

Dati della risposta (OWIN versione 1.0.0)

Key Valore (tipo) Description
owin.ResponseStatusCode int Optional
owin.ResponseReasonPhrase String Optional
owin.ResponseHeaders IDictionary<string,string[]>
owin.ResponseBody Stream

Altri dati (OWIN versione 1.0.0)

Key Valore (tipo) Description
owin.CallCancelled CancellationToken
owin.Version String

Chiavi comuni

Key Valore (tipo) 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 Valore (tipo) Description
sendfile.SendAsync Vedere firma del delegato Per richiesta

Opaco v0.3.0

Key Valore (tipo) Description
opaque.Version String
opaque.Upgrade OpaqueUpgrade Vedere firma del delegato
opaque.Stream Stream
opaque.CallCancelled CancellationToken

WebSocket v0.3.0

Key Valore (tipo) Description
websocket.Version String
websocket.Accept WebSocketAccept Vedere firma del delegato
websocket.AcceptAlt Non-spec
websocket.SubProtocol 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.CloseAsync WebSocketCloseAsync Vedere firma del delegato
websocket.CallCancelled CancellationToken
websocket.ClientCloseStatus int Optional
websocket.ClientCloseDescription String Optional

Risorse aggiuntive