代码之家  ›  专栏  ›  技术社区  ›  Palec dr. evil

微软的决议。网Http。头程序集版本2.2.0与6.0.0依赖于看似不相关的包引用

  •  0
  • Palec dr. evil  · 技术社区  · 2 年前

    尝试使用HeaderNames时。XFrameOptions,我发现它在我的一个项目中有效,在另一个项目则失败。两者都是目标。NET 6。

    在我的应用程序中,我需要使用X-Frame-Options HTTP标头。在可能的情况下,出于可维护性的原因,我会尽量避免自己为这些标准字符串指定常量,而是依靠标准常量。对于此标头的名称,有 HeaderNames.XFrameOptions ,自ASP。NET Core 3.0。

    通过在VS中导航到该类的实现,我发现它工作的项目使用的是微软的6.0.0.0版本(.NET 6,x64)。网Http。收割台装配:

    C: \Program Files\dotnet\shared\Microsoft。AspNetCore。应用程序\6.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.2.0\lib\netstandard2.0\microsoft.net.http.headers.dll

    工作项目是我的控制台应用程序的主项目,而损坏的项目是同一解决方案中的一个库,由控制台应用程序直接引用。

    当我查看这个坏项目的obj\project.assets.json时,我发现了微软。网Http。头在2.2.0版本中确实使用过 referenced by 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\游乐场\Program.cs(1,58):错误CS0117:“HeaderNames”不包含“XFrameOptions”的定义[C:\Repos\操场\游乐场.csproj]

    生成失败。修复生成错误,然后重新运行。

    我尝试将工作项目引用的所有包添加到repo项目中,它修复了它!通过消除并遵循最后一个剩余项目的依赖项,我发现只需添加一个包就可以实现修复( AspNetCore.HealthChecks.UI.Client/6.0.5 ):

    dotnet add package AspNetCore.HealthChecks.UI.Client --version 6.0.5
    dotnet run
    

    X-Frame-Options

    我看到了AspNetCore。健康检查。UI。客户端引用Microsoft。网Http。标头程序集版本6.0.0.0,但直接作为程序集,而不是作为NuGet包。遗憾的是,最新的打包版本是2.2.0.0。

    如何制作HeaderNames。XFrameOptions同时适用于我的两个项目? 正在安装一个不相关的包,如AspNetCore。健康检查。UI。客户是唯一的解决方案吗?有没有更直接的方法来诊断此类组装解决问题?

    0 回复  |  直到 2 年前
        1
  •  1
  •   Palec dr. evil    1 年前

    ASP之间。NET Core 2.2和3.0,分发模式发生了变化。自从NET Core 3.0和ASP。NET Core 3.0 不再发布框架本身的各个包 ,以及 Microsoft.AspNetCore.App shared framework 应该被使用 相反

    共享框架是 由Microsoft隐式引用。NET。Sdk。Web开发包 .

    用于引用类库中的共享框架,更广泛地说 在使用不同SDK的项目中,使用FrameworkReference :

      <ItemGroup>
        <FrameworkReference Include="Microsoft.AspNetCore.App" />
      </ItemGroup>
    

    这是由建议的 guidance for ASP.NET Core use in class libraries 什么时候 deciding whether to preserve compatibility 与古老的ASP。NET Core 2.2及更旧版本,或者是否使用新的API,还有另一个指南。

    从ASP。NET Core 2.2或更高版本到更高版本,请遵循从2.2迁移到3.0的指南: remove the references to the old libraries 和使用 FrameworkReference 在适当的情况下。

    虽然已经在使用更新的ASP。NET核心,注意不要添加对ASP的NuGet包的引用。NET核心2.2。 奇怪的是,旧的软件包并没有被标记为已弃用。

    更多关于FrameworkReference的阅读:

    密切相关的问题: