System.Net.Http Nuget 包和 ASP.NET 核心应用程序之间的依赖关系不匹配

System.Net.Http Dependency Mismatch between Nuget package and ASP.NET Core app

背景

我正在尝试编写一些中间件来使用 ASP.NET Core 进行自定义身份验证。因为我依赖于一些使用 .NET 框架的专有代码,所以我使用的是 ASP.NET Core 的 .Net Framework 版本,而不是 ASP.NET Core 的 .NET Core 版本。

最初,我将中间件直接构建到 ASP.NET 核心应用程序中,并使用 Nuget 安装我的专有依赖项。这工作得很好。

接下来,我想构建一个 Nuget 包,以便我的中间件可以在内部由多个 ASP.NET 核心 Web 服务共享。所以我创建了一个 class 库并添加了中间件代码。我安装了各种 ASP.NET 核心 Nuget 包和我专有的 Nuget 包来解决依赖关系并构建了 Nuget 包。我成功地将它安装在 ASP.NET 核心应用程序中。

问题

当我尝试 运行 中间件时,我得到以下信息:Could not load file or assembly 'System.Net.Http, Version=4.1.1.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' or one of its dependencies. The system cannot find the file specified.

ASP.NET 核心应用程序似乎使用 System.Net.Http 4.0.0

尝试 1

自然地,我查看了 class 库的 System.Net.Http 依赖项。它被拉下到一个 Nuget 包中,恰当地命名为 System.Net.Http。我将该软件包成功安装到 ASP.NET 核心应用程序(或者它告诉我的)。我 运行 应用程序和中间件因同样的错误而失败。困惑的是,我回去查看了 Nuget 包。 System.Net.Http不见了!我重新安装了它 "successfully",但再次搜索软件包显示它没有安装。

我禁用了自动包恢复,我清除了 Nuget 缓存,然后重试。没有运气。该软件包认为它已成功安装,但它从未真正起作用。

这是 ASP.NET 核心应用的 project.json 的相关部分:

{
  "dependencies": {
    "ProprietaryLibrary": "1.0",
    "Microsoft.AspNetCore.Authentication": "1.1.0",
    "Microsoft.AspNetCore.Mvc": "1.1.1",
    "Microsoft.AspNetCore.Routing": "1.1.0",
    "Microsoft.AspNetCore.Server.IISIntegration": "1.1.0",
    "Microsoft.AspNetCore.Server.Kestrel": "1.1.0",
    "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.1.0",
    "Microsoft.Extensions.Configuration.FileExtensions": "1.1.0",
    "Microsoft.Extensions.Configuration.Json": "1.1.0",
    "Microsoft.Extensions.Logging": "1.1.0",
    "Microsoft.Extensions.Logging.Console": "1.1.0",
    "Microsoft.Extensions.Logging.Debug": "1.1.0",
    "Microsoft.Extensions.Options.ConfigurationExtensions": "1.1.0",
    "MyMiddlewarePackage": "1.0.0",
    "ProprietaryDependency": "1.0.0",
    "ProprietaryDependency": "1.0.0",
    "System.Net.Http": "4.0.0" <--- This updates to 4.1.0 if I install that nuget package, but nothing really happens.
  },

  "frameworks": {
    "net461": { }
  }
}

尝试 2

我突然想到我可能没有正确设置 class 库。于是就去https://github.com/aspnet/Security,把他们中间件的工程结构照抄了一遍。我再次安装了我的依赖项(一个小得多的列表!),并成功构建。我再次构建了一个 Nuget 包并将其安装到 ASP.NET Core 应用程序。但是,我再次遇到关于版本 4.1.1.0 的相同错误。

这是新 class 库的 project.json:

{
  "dependencies": {
    "Microsoft.AspNetCore.Authentication": "1.0.0",
    "Microsoft.Extensions.Caching.Memory": "1.0.0",
    "Microsoft.Extensions.Options": "1.0.0",
    "Microsoft.Extensions.WebEncoders": "1.0.0"
  },

  "frameworks": {
    "net461": {
      "dependencies": {
        "ProprietaryLibrary": "1.0.0"
      }
    }
  }
}

根本没有引用 System.Net.Http

如果您对那个专有库感到好奇,这里是参考树。所有空白的东西都是专有的 DLL。所以我在那里也没有看到任何 System.Net.Http 参考。我不是说它不存在,但我看不到它。即使它在那里,为什么那个专有库直接嵌入到 ASP.NET 核心应用程序中就可以正常工作?

总结

我无法弄清楚 System.Net.Http 4.1.1.0 在哪里被引用,并且我无法进行 ASP.NET 核心更新以使用比 4.0.0.0 更新的任何内容。但是,如果我直接在 ASP.NET Core 应用程序中粘贴我的代码并下载依赖项,一切正常。

有什么想法吗?

更新

看起来问题出在 Microsoft.AspNetCore.Authentication Nuget 包上。每次安装时,它都会更新 System.Net.Http 的新版本。关于如何防止这种情况的任何想法?

好的,我明白了。问题出在包 Microsoft.AspNetCore.Authentication 上。

缩小范围后,微软似乎意识到了这个问题:https://github.com/aspnet/Security/issues/1046。听起来他们会在一个月内发布修复程序。

这是修复它的提交:https://github.com/aspnet/Security/commit/0f429324c54e380eeed235fea2bdfabb3639f43e