2017-08-23 1 views
2

Wie in offiziellen document angegeben zu konfigurieren, ich versuche UseOwin in den Startup.cs. zu implementieren I/Port IAppBuilder (Microsoft.Owin.Builder.AppBuilder) innen IApplicationBuilder (Microsoft.AspNetCore.Builder.IApplicationBuilder) zu verwenden versuchen. Ich hatte Legacy-Code geschrieben mit IAppBuilder läuft gut auf .Net Framework 4.5.Unable 'IApplicationBuilder UseOwin'

Ich habe einige Beispiele über die Verwendung von IAppBuilder in IAplicationBuilder gesehen, z. example 1example 2. Diese Versuche betrafen .netcore 1.1 und nicht .net core 2.0. Möglicherweise ist das der Grund, warum ich nicht portieren kann.

Bitte teilen Sie Ihre Gedanken, ob ich versuche, etwas zu erreichen, was im Moment nicht möglich ist .net core 2.0 oder es gibt einen Fehler in meinem Code.

Hinweis: ich verwende dotnetcore 2.0 mit Visual Studio 2017

Fehler

verfolge ich Fehler.

Rückgabe owinAppBuilder.Build, Aufgabe >>(); TypeLoadException: Der Typ 'System.Security.Cryptography.DpapiDataProtector' konnte nicht von Assembly 'System.Security, Version = 4.0.0.0, Culture = neutral, PublicKeyToken = b03f5f7f11d50a3a' geladen werden.

Mein Versuch

app.UseOwin(setup => setup(next => 
    { 
     var owinAppBuilder = new AppBuilder(); 

     var aspNetCoreLifetime = 
      (IApplicationLifetime)app.ApplicationServices.GetService(typeof(IApplicationLifetime)); 

     new AppProperties(owinAppBuilder.Properties) 
     { 
      OnAppDisposing = aspNetCoreLifetime?.ApplicationStopping ?? CancellationToken.None, 
      DefaultApp = next, 
      AppName = "test" 
     }; 

     // Only required if CORS is used, configure it as you wish 
     var corsPolicy = new System.Web.Cors.CorsPolicy 
     { 

      AllowAnyHeader = true, 
      AllowAnyMethod = true, 
      AllowAnyOrigin = true, 
      SupportsCredentials = true 
     }; 

     //corsPolicy.GetType() 
     //  .GetProperty(nameof(corsPolicy.ExposedHeaders)) 
     //  .SetValue(corsPolicy, tusdotnet.Helpers.CorsHelper.GetExposedHeaders()); 

     owinAppBuilder.UseCors(new Microsoft.Owin.Cors.CorsOptions 
     { 
      PolicyProvider = new CorsPolicyProvider 
      { 
       PolicyResolver = context => Task.FromResult(corsPolicy) 
      } 
     }); 

     PublicClientId = "self"; 

     OAuthAuthorizationServerOptions OAuthOptions = new OAuthAuthorizationServerOptions 
     { 
      TokenEndpointPath = new Microsoft.Owin.PathString("/Login"), 
      Provider = new MyServiceProvider(PublicClientId), 

      AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(60), 
      AllowInsecureHttp = true, 
      RefreshTokenProvider = new MyRefreshTokenProvider(), 
     }; 

     owinAppBuilder.UseOAuthBearerTokens(OAuthOptions); 
     //owinAppBuilder.UseTus(context => new DefaultTusConfiguration 
     //{ 
     // // Excluded for brevity, use the same configuration as you would normally do 
     //}); 


     return owinAppBuilder.Build<Func<IDictionary<string, object>, Task>>(); 
    })); 
+0

Gleiches hier, haben Sie es geschafft, eine Lösung zu finden? Ich benötige OWIN für SignalR selbst/ – NullBy7e

Antwort

-1

Die Microsoft.Owin Komponenten auf Dotnet Kern nicht 2.0, funktioniert sie nur auf .NET arbeiten 4.5+

+0

Ich bin mir sicher, dass Sie hier falsch liegen! Hast du zwei Beispiele überprüft, die ich mit meiner Frage gepostet habe? In diesen Beispielen ging es darum, 'IAppBuilder' mit 'IApplcationBuilder' zu verwenden. Bitte lies sie zuerst. Und wie wäre es mit dieser offiziellen Richtlinie von Microsoft, die über die Verwendung von Owin für die .net-Core-App spricht? https://docs.microsoft.com/en-us/aspnet/core/fundamentals/owin – immirza

+0

Ein großer Teil der Verwirrung hier ist, dass Asp.Net Core auf .Net und .Net Core laufen kann. Das erste Beispiel verwendet Asp.Net Core auf .Net. – Tratcher

1

Microsoft.Owin und zugehöriger Pakete haben keine Ziele für .NET Core, nicht für .NET Standard. Alles, was sie haben, ist DLLs, die auf .NET abzielen. Sie können auf solche Bibliotheken aus Ihrem Projekt, das auf .NET Core abzielt, verweisen, aber sie funktionieren nicht garantiert, wie Sie selbst sehen, da sich die API (set of classes \ methods \ signatures) von .NET und .NET Core unterscheidet. Visual Studio zeigt auch eine Warnung, wenn Sie das tun, zum Beispiel:

Package ‚Microsoft.Owin 3.1.0‘ wurde mit restaurierten ‘.NETFramework, Version = v4.6.1' anstelle des Projektziel Framework '.NETCoreApp, Version = v2.0'. Dieses Paket ist möglicherweise nicht vollständig kompatibel mit Ihrem Projekt.

Es gibt Microsoft.AspNetCore.Owin Paket und können Sie OWIN Middleware in .NET Core-App als erster Link beschreibt verwenden, aber fast alle bietet es ist UseOwin Erweiterungsmethode. Es gibt keine AppBuilder Art dort und so weiter, und es gibt keine Microsoft.AspNetCore.Owin.Cors Pakete oder ähnliches. Also müssen Sie entweder alles selbst implementieren (ohne Grund, weil Sie die gleiche Funktionalität wie im asp.net core Framework verwenden können) oder auf OWIN-Pakete warten, die auf .NET Standard \ Core zielen und das tun (nicht überprüfen, vielleicht existieren sie sogar schon).

Also verwendet Ihr Code Pakete, die in der Tat nicht mit Ihrem Zielframework kompatibel sind, als Ausnahme haben Sie zur Laufzeit zeigt. Daher ist eine andere Antwort (aus irgendeinem Grund falsch) technisch korrekt.

Wenn Sie diese Pakete weiterhin zuverlässig verwenden möchten, müssen Sie auf das vollständige .NET Framework und nicht auf .NET Core abzielen. Um das zu tun, öffnen Sie Ihre CSPROJ Datei und ändert

<TargetFramework>netcoreapp2.0</TargetFramework> 

Gewisse .NET Framework-Version, die .NET-Standard 2.0, zum Beispiel unterstützt:

<TargetFramework>net47</TargetFramework> 

Dann gehen Sie zu nuget Paket-Manager, und wenn Sie haben microsoft.aspnetcore.all Paket (oder andere Pakete, die auf .NET Core abzielen) - deinstallieren Sie es, Sie brauchen es trotzdem nicht. Dann installieren Sie das Paket Microsoft.AspNetCore und alle anderen benötigten asp.net-Kernpakete (falls nicht bereits installiert). Rebuild, run und es wird gut funktionieren.

Das funktioniert, weil alle (die meisten?) AspNetCore-Pakete auf .NET Standard und nicht auf .NET Core abzielen und Sie sie in Projekten verwenden können, die auf .NET Framework abzielen.

Beachten Sie, dass Sie damit asp.net Core-Projekt haben, aber nicht auf .NET Core mit allen Konsequenzen, die daraus entstehen (kann nicht mit dotnet run laufen, auf Linux muss mit Mono laufen, und so weiter).

+0

Genau das habe ich auch herausgefunden. – NullBy7e