gpt4 book ai didi

c# - 更新 .NET Standard 库以使用 ASP.NET Core 2.2 和 3.0

转载 作者:行者123 更新时间:2023-12-04 15:39:01 27 4
gpt4 key购买 nike

我有一个 .NET Standard 库,在我们组织中的多个 Web 应用程序之间共享。由于它们都使用相同的身份验证方案,因此将代码放入可共享的库中。所有网络应用程序都针对 netcoreapp2.2和库目标 netstandard2.0 .我已将第一个 Web 应用程序更新为 netcoreapp3.0这样做后,它在启动时失败并出现此错误:

System.MissingFieldException: Field not found: 'Microsoft.AspNetCore.Server.IISIntegration.IISDefaults.AuthenticationScheme'.



这是在库的扩展方法中从这一行抛出的:
services.AddAuthentication(IISDefaults.AuthenticationScheme);
这是什么 .csproj最初在更新之前查看的库文件:
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>netstandard2.0</TargetFrameworks>
<RootNamespace></RootNamespace>
<AssemblyName></AssemblyName>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="2.2.1" />
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="2.2.0" />
<PackageReference Include="Microsoft.Graph" Version="1.17.0" />
<PackageReference Include="Microsoft.Identity.Client" Version="4.4.0" />
</ItemGroup>

</Project>

这适用于我们的 ASP.NET Core 2.2 应用程序。经过一些修改后,我在将库更改为以下内容后运行了 ASP.NET Core 3.0 应用程序:
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFrameworks>netcoreapp3.0;netstandard2.0</TargetFrameworks>
<RootNamespace></RootNamespace>
<AssemblyName></AssemblyName>
</PropertyGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'netcoreapp3.0'">
<FrameworkReference Include="Microsoft.AspNetCore.App" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="3.0.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="3.0.0" />
<PackageReference Include="Microsoft.Graph" Version="1.17.0" />
<PackageReference Include="Microsoft.Identity.Client" Version="4.4.0" />
</ItemGroup>

<ItemGroup Condition="'$(TargetFramework)' == 'netstandard2.0'">
<PackageReference Include="Microsoft.AspNetCore.Authentication.Cookies" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="2.2.0" />
<PackageReference Include="Microsoft.AspNetCore.Server.IISIntegration" Version="2.2.1" />
<PackageReference Include="Microsoft.Extensions.Caching.Abstractions" Version="2.2.0" />
<PackageReference Include="Microsoft.Graph" Version="1.17.0" />
<PackageReference Include="Microsoft.Identity.Client" Version="4.4.0" />
</ItemGroup>

</Project>

这是这样做的首选/正确方法,还是有更简单的方法?图书馆是否应该使用 Microsoft.NET.Sdk.Web SDK代替?

最佳答案

我们在迁移为 .NET 标准 2.0 构建的身份验证库时遇到了同样的问题,该库在我们迁移到 3.1 的 .NET Core 2.1 应用程序中使用。我们收到了关于 IISDefaults.AuthenticationScheme 的相同错误消息。

根据您的评论(顺便说一句!)看起来是的,他们确实从 static readonly string 更改了该值到 const string ,肯定是一个突破性的变化,但不是一个受欢迎的变化(至少在当下)。我在迁移文档中的任何地方都找不到具体提到的这一点(由@McKabue 链接)。

这是该领域的 .NET Core 2.2 文档:

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.server.iisintegration.iisdefaults.authenticationscheme?view=aspnetcore-2.2

这是 .NET Core 3.0,当切换到 const 时:

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.server.iisintegration.iisdefaults.authenticationscheme?view=aspnetcore-3.0

修复

正如您在评论中提到的,只需替换 IISDefaults.AuthenticationScheme与字符串值 "Windows" ,因为这就是字段/常量值无论如何都返回的内容。这避免了 .NET Core 2.2 和 .NET 3.0+ 之间的兼容性问题,没有大惊小怪。

历史

Bing 和我环顾四周寻找任何关于此的具体内容,并在 Github 上发现了一些关于它的有趣内容。

https://github.com/dotnet/aspnetcore/issues/3838 - 值是字段而不是常量的问题。 Note Tratcher 说:

It was a mistake. Yes we should change it but we can't until 3.0. You can use the actual value "Windows" as a workaround.



然后,将其从静态只读更改为常量的拉取请求:
https://github.com/dotnet/aspnetcore/pull/4342/files/6def4a71dcb45fdd07278c11698bf9595c193dd9

关于c# - 更新 .NET Standard 库以使用 ASP.NET Core 2.2 和 3.0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58661792/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com