Come utilizzare il middleware Owin basato su IAppBuilder in ASP.NET 5

ASP.NET 5 (aspnet vnext) è basato su OWIN come Katana, ma ha diverse astrazioni. In particolare IAppBuilder è stato sostituito da IApplicationBuilder . Molte librerie middleware dipendono da IAppBuilder e non sono state aggiornate per supportare ASP.NET 5

Come posso utilizzare questo middleware OWIN nel middleware APS.NET 5. Entrambi sono basati su OWIN quindi dovrebbe essere ansible.

Microsoft.AspNet.Builder.OwinExtensions fornisce un metodo UseOwin , ma è basato sulle firme OWIN di basso livello, quindi non può essere utilizzato con i metodi che si aspettano IAppBuilder .

Modifica: ora puoi usare il pacchetto AspNet.Hosting.Katana.Extensions per quello.


Ecco una versione leggermente diversa, che utilizza AppBuilder.DefaultApp :

 public static IApplicationBuilder UseOwinAppBuilder(this IApplicationBuilder app, Action configuration) { if (app == null) { throw new ArgumentNullException(nameof(app)); } if (configuration == null) { throw new ArgumentNullException(nameof(configuration)); } return app.UseOwin(setup => setup(next => { var builder = new AppBuilder(); var lifetime = (IApplicationLifetime) app.ApplicationServices.GetService(typeof(IApplicationLifetime)); var properties = new AppProperties(builder.Properties); properties.AppName = app.ApplicationServices.GetApplicationUniqueIdentifier(); properties.OnAppDisposing = lifetime.ApplicationStopping; properties.DefaultApp = next; configuration(builder); return builder.Build, Task>>(); })); } 

Nota che il riferimento a Microsoft.Owin rende la tua app incompatibile con dnxcore50 (Core CLR).

Il riferimento spesso citato che i framework sono compatibili è un metodo di estensione creato da Thinktecture per supportare IdentityServer3 su ASP.NET 5 .

Questo metodo è specifico per IdentityServer e non supporta la richiesta elaborata da alcun middleware registrato successivamente nella pipeline AspNet (non chiama il componente successivo).

Questo adatta il metodo per affrontare queste carenze:

 internal static class IApplicationBuilderExtensions { public static void UseOwin( this IApplicationBuilder app, Action owinConfiguration ) { app.UseOwin( addToPipeline => { addToPipeline( next => { var builder = new AppBuilder(); owinConfiguration( builder ); builder.Run( ctx => next( ctx.Environment ) ); Func, Task> appFunc = (Func, Task>) builder.Build( typeof( Func, Task> ) ); return appFunc; } ); } ); } } 

Può essere usato come segue:

 app.UseOwin( owin => { // Arbitrary IAppBuilder registrations can be placed in this block // For example, this extension can be provided by // NWebsec.Owin or Thinktecture.IdentityServer3 owin.UseHsts(); } ); // ASP.NET 5 components, like MVC 6, will still process the request // (assuming the request was not handled by earlier middleware) app.UseMvc();