无法配置' IApplicationBuilder UseOwin'

时间:2017-08-23 19:07:32

标签: c# asp.net-core owin

正如官方document所述,我正在UseOwin尝试在Startup.cs.内使用/ IAppBuilder (Microsoft.Owin.Builder.AppBuilder) IApplicationBuilder (Microsoft.AspNetCore.Builder.IApplicationBuilder)中实施IAppBuilder。我使用{。{1}}编写的遗留代码在.Net Framework 4.5上正常运行。

我已经看过几个关于在IAplicationBuilder中使用IAppBuilder的例子,例如example 1 example 2。这些尝试是关于.netcore 1.1而不是.net core 2.0。可能这是我无法移植的原因。

请分享您的想法,我是否正在尝试实现.net core 2.0中目前无法实现的功能,或者我的代码中存在一些错误。

注意: 我正在使用dotnetcore 2.0Visual Studio 2017

错误

我收到了以下错误。

  

返回owinAppBuilder.Build,   任务>>(); TypeLoadException:无法加载类型   ' System.Security.Cryptography.DpapiDataProtector'从装配   ' System.Security,Version = 4.0.0.0,Culture = neutral,   公钥= b03f5f7f11d50a3a'

我的尝试

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

2 个答案:

答案 0 :(得分:2)

Microsoft.Owin和相关的包没有.NET Core的目标,没有.NET Standard的目标。他们所拥有的只是针对完整.NET的dll。您可以从针对.NET Core的项目中引用这些库,但是不能保证它们可以正常工作,因为您看到自己,因为完整.NET和.NET Core的API(类/方法\签名集)是不同的。 Visual Studio甚至会在您执行此操作时显示警告,例如:

  

Package&#39; Microsoft.Owin 3.1.0&#39;恢复使用   &#39; .NETFramework,版本= v4.6.1&#39;而不是项目目标框架   &#39; .NETCoreApp,版本= 2.0&#39 ;.此包可能不完全兼容   与您的项目。

Microsoft.AspNetCore.Owin个软件包,您可以在.NET Core应用程序中使用OWIN中间件作为您的第一个链接描述,但它提供的几乎所有内容都是UseOwin扩展方法。那里没有AppBuilder类型,依此类推,并且没有Microsoft.AspNetCore.Owin.Cors个包或类似的包。所以你必须自己实现所有这些(没有理由,因为你可以使用asp.net核心框架提供的相同功能)或者等待面向.NET Standard \ Core的OWIN包并做到这一点(没有理由)检查,也许他们甚至已经存在了。)

因此,您的代码使用的包确实与您的目标框架不兼容,因为您在运行时显示的异常。因此,另一个答案(由于某种原因,downvoted)在技术上是正确的。

如果您仍然希望可靠地使用这些软件包 - 您需要定位完整的.NET Framework而不是.NET Core。为此,请打开.csproj文件并更改

<TargetFramework>netcoreapp2.0</TargetFramework>

支持.NET Standard 2.0的某些.NET框架版本,例如:

<TargetFramework>net47</TargetFramework>

然后去nuget包管理器,如果你有microsoft.aspnetcore.all包(或其他针对.NET Core的包) - 卸载它,你无论如何都不需要它。然后安装Microsoft.AspNetCore包和所需的所有其他asp.net核心包(如果尚未安装)。重建,运行,它会正常工作。

这是有效的,因为所有(大多数?)AspNetCore包都以.NET Standard为目标,而不是.NET Core,您可以在面向完整.NET Framework的项目中使用它们。

请注意,通过这样做你有asp.net Core项目,但不是在.NET Core上,由此产生的所有后果(无法与dotnet run一起运行),linux上需要运行单声道,所以上)。

答案 1 :(得分:-1)

Microsoft.Owin组件不适用于dotnet core 2.0,它们仅适用于.NET 4.5 +