如何在ASP.NET 5中使用基于IAppBuilder的Owin中间件

ASP.NET 5(aspnet vnext)是基于OWIN的,像Katana一样,但有不同的抽象。 值得注意的是, IAppBuilder已被IApplicationBuilder取代。 许多中间件库依赖于IAppBuilder并且尚未更新以支持ASP.NET 5

如何在APS.NET 5中间件中使用此OWIN中间件。 两者都是基于OWIN的,所以它应该是可能的。

Microsoft.AspNet.Builder.OwinExtensions确实提供了UseOwin方法,但它基于低级OWIN签名,因此不能与期望IAppBuilder方法一起使用。

编辑:您现在可以使用AspNet.Hosting.Katana.Extensions包 。


这是一个略有不同的版本,使用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>>(); })); } 

请注意,引用Microsoft.Owin会使您的应用与dnxcore50 (Core CLR)不兼容。

经常提到的框架兼容的参考是Thinktecture为在ASP.NET 5上支持IdentityServer3而构建的扩展方法 。

该方法特定于IdentityServer,并且不支持稍后在AspNet管道中注册的任何中间件处理的请求(它不调用下一个组件)。

这使得该方法能够解决这些缺点:

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

它可以使用如下:

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