2015-06-09 14 views
16

ASP.NET 5 (aspnet vnext) jest oparty na OWIN jak Katana, ale ma inne abstrakcje. W szczególności IAppBuilder został zastąpiony przez IApplicationBuilder. Wiele bibliotek oprogramowania pośredniego zależy od programu ASP.NET 5Jak korzystać z middleware IAppBuilder Owin w ASP.NET 5

Jak używać tego oprogramowania pośredniego OWIN w oprogramowaniu pośredniczącym APS.NET 5. Oba są oparte na OWIN, więc powinno być możliwe.

Microsoft.AspNet.Builder.OwinExtensions dostarcza metodę UseOwin, ale opiera się na sygnaturach OWIN niskiego poziomu, więc nie może być używana z metodami wymagającymi IAppBuilder.

Odpowiedz

10

Edit: można teraz używać AspNet.Hosting.Katana.Extensions package do tego.


Oto nieco inna wersja, która używa 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>>(); 
    })); 
} 

Należy pamiętać, że odwołanie Microsoft.Owin czyni aplikację niezgodną z dnxcore50 (Core CLR).

+0

Nie rozumiem pełnych implikacji, ale to działa i wydaje się, że może być bardziej niezawodne z powodu dodatkowych przydziałów nieruchomości. Aby upewnić się, że czegoś nie brakuje, ta implementacja wymaga również odniesienia do 'Microsoft.Owin', czyniąc implementacje identycznymi pod tym względem? – vossad01

+0

Oczywiście zależy to od AppBuilder, który jest częścią Microsoft.Owin. Próbujesz go naprawić, aby uniknąć odwoływania się do firmy Microsoft.Owin byłby fajnym ćwiczeniem, ale nie jestem pewien, czy byłby tego wart, ponieważ nadal musiałbyś portować oprogramowanie pośredniczące OWIN/Katana, które chciałbyś użyć do Core CLR. – Pinpoint

+0

uszkodzony link .... –

3

Często cytowane odniesienie do kompatybilności frameworków to an extension method build by Thinktecture for supporting their IdentityServer3 on ASP.NET 5.

Ta metoda jest specyficzna dla serwera tożsamości i nie obsługuje żądania przetwarzanego przez żadne oprogramowanie pośredniczące zarejestrowane później w rurociągu AspNet (nie wywołuje następnego komponentu).

ten dostosowuje metodę do rozwiązania tych niedociągnięć:

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

Może być stosowany w sposób następujący:

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

Podczas próby replikowania obiektu IApplicationBuilderExtension znajdującego się w podanym odsyłaczu pojawia się następujący błąd: oczekuje się nazwy metody. Linia, do której się odnosimy, jest linią zawierającą drugą wzmiankę o addToPipeline – MRainzo

+0

, bardzo dziękuję za odpowiedź @ vossad01. Rzeczywiście mam odniesienie Owin ('Microsoft.AspNet.Owin' nie może być rozwiązany, ale' Microsoft.Owin' może być) i podaje typ 'addToPipeline' jako' IAppBuilder'. – MRainzo

+1

@MRainzo, Wygląda na to, że brakuje Ci pakietu NuGet 'Microsoft.AspNet.Owin'. Jeśli dodanie tego nie rozwiąże problemu, prawdopodobnie będę musiał wiedzieć, jakiej wersji ASP.NET 5 używasz. Opisane przez Ciebie informacje sugerują, że brakuje wspomnianej biblioteki i mają powyższy kod (zamiast połączonego kodu). W ten sposób widzimy, że 'UseOwin' jest wywołaniem powyższej metody (która miałaby parametr lambda typu' IAppBuilder'). – vossad01