无法配置“IApplicationBuilder UseOwin”

2024-05-19

正如官方所说document https://learn.microsoft.com/en-us/aspnet/core/fundamentals/owin,我正在尝试实施UseOwin in the Startup.cs.我正在尝试使用/端口IAppBuilder (Microsoft.Owin.Builder.AppBuilder) inside IApplicationBuilder (Microsoft.AspNetCore.Builder.IApplicationBuilder)。我使用以下代码编写了遗留代码IAppBuilder在 .Net Framework 4.5 上运行良好。

我见过几个关于在 IAplicationBuilder 中使用 IAppBuilder 的示例,例如示例1 https://www.codeproject.com/Articles/1122162/Implement-Owin-Pipeline-using-Asp-net-Core 示例2 https://github.com/tusdotnet/tusdotnet/wiki/Troubleshoot:-%22'IApplicationBuilder'-does-not-contain-a-definition-for-'UseTus'%22-in-ASP.NET-Core。这些尝试是关于 .netcore 1.1 而不是 .net core 2.0。可能这就是我无法移植的原因。

请分享您的想法,无论我是想在 .net core 2.0 中实现目前不可能实现的目标,还是我的代码中存在一些错误。

笔记: 我在用dotnetcore 2.0 with Visual Studio 2017

Error

我收到以下错误。

返回owinAppBuilder.Build, 任务>>(); TypeLoadException:无法加载类型 程序集中的“System.Security.Cryptography.DpapiDataProtector” '系统.安全性,版本=4.0.0.0,文化=中性, PublicKeyToken=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>>();
    }));

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

包“Microsoft.Owin 3.1.0”已使用恢复 '.NETFramework,Version=v4.6.1' 而不是项目目标框架 '.NETCoreApp,版本=v2.0'。该软件包可能不完全兼容 与你的项目。

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

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

如果您仍然想可靠地使用这些包 - 您需要以完整的 .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 Core 包(如果尚未安装)。重建,运行,它会工作得很好。

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

请注意,通过这样做,您拥有 asp.net Core 项目,但不在 .NET Core 上,从而产生由此产生的所有后果(无法运行dotnet run,在linux上需要用mono运行,等等)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

无法配置“IApplicationBuilder UseOwin” 的相关文章