Se creo un middleware OWIN utilizzando i tipi Microsoft.Owin come OwinMiddleware e IOwinContext, il mio middleware funzionerà con host/server Owin non Microsoft? Sto osservando le classi middleware per Nancy e SignalR e sembrano molto diverse dalla classe base OwinMiddleware che i media come il middleware di autenticazione Cookie e WebApi sono basati su. Sto leggendo le specifiche ma non sono ancora chiaro se un server Owin non Microsoft potrebbe funzionare con il tipo OwinMiddleware e IOwinContext senza avere una dipendenza da Microsoft.Owin (che suppongo possa vanificare lo scopo di Owin).I tipi Microsoft.Owin come OwinMiddleware e IOwinContext sono incompatibili con altri server Owin?
I tipi Microsoft.Owin come OwinMiddleware e IOwinContext sono incompatibili con altri server Owin?
risposta
Se si crea il middleware con il tipo di base OwinMiddleware, per impostazione predefinita non funzionerà con server Microsoft Owin non. Ma può essere fatto funzionare con server non Microsoft (SignalR funziona bene con Nowin come esempio).
L'implementazione predefinita di IAppBuilder (https://github.com/owin/owin-hosting/blob/master/src/main/Owin.Builder/AppBuilder.cs) ha una funzione di conversione di firma costruito nel Questo permette a chiunque di registrare una conversione da T -.> AppFunc e AppFunc -> T. Questo significa che si può mescolare e abbinare middleware con firme diverse nella stessa pipeline. (vedi https://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin/Infrastructure/SignatureConversions.cs per un esempio di come funziona OwinMiddleware). Finché esiste questa conversione, è possibile rendere il middleware "grezzo" (come nancy) compatibile con OwinMiddleware. Per vedere come funziona questo aspetto qui:
https://github.com/owin/owin-hosting/blob/master/src/main/Owin.Builder/AppBuilder.cs#L182 (Ora che il vostro cervello come esploso ... continua a leggere)
Nel caso di SignalR, aggiungiamo automaticamente la conversione a vostro nome (https://github.com/SignalR/SignalR/blob/dev/src/Microsoft.AspNet.SignalR.Core/Owin/OwinExtensions.cs#L168), ma può essere fatto in qualsiasi codice che dipende da OwinMiddleware per assicurarsi che la transizione funzioni.
Se si utilizza uno dei Microsoft.Owin.Hosting per avviare la propria applicazione ma si utilizza un server Web non Microsoft, si otterrà anche la conversione gratuita (vedere l'ora in lettura per un esempio https://github.com/Bobris/Nowin/blob/master/README.md).
Spero che questo aiuti.
Grazie per la fantastica risposta e i collegamenti! Questo è esattamente il livello di dettaglio di cui avevo bisogno per avere un senso per me. Auguro solo a tutti di attenersi a una singola firma del metodo invece di fare tutti questi ninja volanti, imprese super umane di codifica per convertire da una firma all'altra. La codifica è abbastanza difficile come lo è – enamrik
OwinMiddleware è piuttosto inutile. Aiuta la scoperta un po 'e ti dà una certa dattilografia, ma puoi ottenere gli stessi benefici se usi MS.Owin solo per OwinContext e implementi manualmente AppFunc. – davidfowl
Ho creato un problema su questo di recente: http://katanaproject.codeplex.com/workitem/81 – bbaia