2015-06-09 25 views
16

ASP.NET 5(aspnet vnext)是基于OWIN的,就像Katana一样,但具有不同的抽象。值得注意的是IAppBuilder已被IApplicationBuilder取代。许多中间件库取决于IAppBuilder并且尚未更新为支持ASP.NET 5如何在ASP.NET中使用基于IAppBuilder的Owin中间件5

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

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

回答

10

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


这里有一个稍微不同的版本,使用AppBuilder.DefaultApp

public static IApplicationBuilder UseOwinAppBuilder(this IApplicationBuilder app, Action<IAppBuilder> 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<Func<IDictionary<string, object>, Task>>(); 
    })); 
} 

注意引用Microsoft.Owin让您的应用dnxcore50(核心CLR)不兼容。

+0

我不明白完整的含义,但这是有效的,并且由于额外的财产分配,似乎可能更健壮。只是为了确保我没有遗漏某些东西,这个实现还需要引用'Microsoft.Owin'使得实现在这方面是相同的? – vossad01

+0

当然,它取决于AppBuilder,它是Microsoft.Owin的一部分。试图重构它以避免引用Microsoft。Owin是一个很好的练习,但我不确定这是否值得,因为您仍然需要将您想使用的OWIN/Katana中间件移植到Core CLR。 – Pinpoint

+0

断开链接.... –

3

经常被引用的参考框架是兼容的an extension method build by Thinktecture for supporting their IdentityServer3 on ASP.NET 5

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

此相适应的方法来解决这些不足之处:

internal static class IApplicationBuilderExtensions 
{ 
    public static void UseOwin(
    this IApplicationBuilder app, 
    Action<IAppBuilder> owinConfiguration) 
    { 
    app.UseOwin(
     addToPipeline => 
     { 
      addToPipeline(
      next => 
       { 
       var builder = new AppBuilder(); 

       owinConfiguration(builder); 

       builder.Run(ctx => next(ctx.Environment)); 

       Func<IDictionary<string, object>, Task> appFunc = 
        (Func<IDictionary<string, object>, Task>) 
        builder.Build(typeof(Func<IDictionary<string, object>, 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(); 
+0

尝试复制提供的链接中找到的IApplicationBuilderExtension时,出现此错误:方法名称应为。被引用的行是包含第二次提到的addToPipeline – MRainzo

+0

的行,非常感谢您的回复@ vossad01。我确实参考了Owin('Microsoft.AspNet.Owin'无法解析,但'Microsoft.Owin'可以),并将'addToPipeline'的类型作为IAppBuilder。 – MRainzo

+1

@MRainzo,听起来好像你错过了NuGet软件包'Microsoft.AspNet.Owin'。如果添加这个不能解决问题,我可能需要知道您使用的是什么版本的ASP.NET 5。 你所描述的建议你错过了上面提到的库,并且有上面的代码(而不是链接的代码)。因此,它将UseOwin看作是对上述方法的调用(它将有一个类型为IAppBuilder的lambda参数)。 – vossad01

相关问题