在尝试使用 HeaderNames.XFrameOptions 时,我发现它在我的一个项目中有效,但在另一个项目中失败。两者都针对 .NET 6。
在我的应用程序中,我需要使用 X-Frame-Options HTTP 标头。如果可能,出于可维护性的原因,我尝试避免自己为此类标准字符串指定常量,而是依赖标准常量。对于此标头的名称,有 HeaderNames.XFrameOptions,自 ASP.NET Core 3.0 起可用。
通过在 VS 中导航到该类的实现,我发现它所在的项目使用 Microsoft.Net.Http.Headers 程序集的版本 6.0.0.0(.NET 6,x64):
C:\Program Files\dotnet\shared\Microsoft.AspNetCore.App .0.12\Microsoft.Net.Http.Headers.dll
它不起作用的项目使用版本2.2.0.0(.NET Standard 2.0,MSIL)的程序集:
C:\ Program Files \ dotnet \ sdk \ NuGetFallbackFolder \ microsoft.net.http.headers .2.0 \ lib etstandard2.0\Microsoft.Net.Http.Headers.dll
工作项目是我的控制台应用程序的主项目,损坏的项目是同一解决方案中的库,由控制台应用程序直接引用。
当我查看损坏的项目的 obj\project.assets.json 时,我发现 Microsoft.Net.Http.Headers 确实在 2.2.0 版本中使用,并且它被 Microsoft.AspNetCore.Http.Extensions/2.2 引用。 0,这也用在破碎的项目中。
我使用该信息重现了失败:
dotnet new globaljson --sdk-version 6.0.404 --roll-forward disable
dotnet new console -f net6.0
dotnet add package Microsoft.AspNetCore.Http.Extensions --version 2.2.0
echo "Console.WriteLine(Microsoft.Net.Http.Headers.HeaderNames.XFrameOptions);" > Program.cs
dotnet run
C:\Repos\playground\Program.cs(1,58):错误 CS0117:“HeaderNames”不包含“XFrameOptions”的定义 [C:\Repos\playground\playground.csproj]我尝试将工作项目引用的所有包添加到重现项目中,它修复了它!通过消除并遵循最后一个剩余项目的依赖关系,我发现只需添加一个包即可实现修复(构建失败。修复构建错误并再次运行。
AspNetCore.HealthChecks.UI.Client/6.0.5):
dotnet add package AspNetCore.HealthChecks.UI.Client --version 6.0.5
dotnet run
X 框架选项我看到 AspNetCore.HealthChecks.UI.Client 引用了 Microsoft.Net.Http.Headers 程序集版本 6.0.0.0,但直接引用为程序集,而不是 NuGet 包。遗憾的是,最新的打包版本是2.2.0.0。
如何使 HeaderNames.XFrameOptions 同时在我的两个项目中工作? 安装像 AspNetCore.HealthChecks.UI.Client 这样不相关的包是唯一的解决方案吗?有没有更直接的方法来诊断此类程序集解析问题?
Microsoft.AspNetCore.App共享框架来代替。
Microsoft.NET.Sdk.Web SDK 隐式引用共享框架。要在类库中以及更一般地在使用不同 SDK 的项目中引用共享框架,请使用 FrameworkReference:
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
这是类库中 ASP.NET Core 使用指南推荐的。当决定是否保留与古老的 ASP.NET Core 2.2 及更早版本的兼容性或是否使用新的 API 时,还有另一个指南。
从 ASP.NET Core 2.2 或更早版本迁移到较新版本时,请遵循从 2.2 迁移到 3.0 的指南:删除对旧库的引用并在适当的情况下使用FrameworkReference。
虽然已经使用较新的 ASP.NET Core,但请注意不要添加对 ASP.NET Core 2.2 的 NuGet 包的引用。奇怪的是,旧包没有标记为已弃用。
更多阅读框架参考: