【问题标题】:System.Net.Http Dependency Mismatch between Nuget package and ASP.NET Core appNuget 包和 ASP.NET Core 应用程序之间的 System.Net.Http 依赖项不匹配
【发布时间】:2017-06-24 02:10:00
【问题描述】:

背景

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

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

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

问题

当我尝试运行中间件时,我得到以下信息: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 Core 应用似乎使用了System.Net.Http 4.0.0

尝试 1

当然,我查看了类库的System.Net.Http 依赖项。它在 Nuget 包中被拉下,适当地命名为 System.Net.Http。我成功地将该包安装到 ASP.NET Core 应用程序(或者它告诉我的)。我运行了该应用程序,但中间件因同样的错误而失败。很困惑,我回去查看了 Nuget 包。 System.Net.Http 不见了!我再次“成功”安装了它,但再次搜索该软件包显示它没有安装。

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

这是 ASP.NET Core 应用的 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

我突然想到我可能错误地设置了类库。于是我去了https://github.com/aspnet/Security,复制了他们中间件的项目结构。我再次安装了我的依赖项(一个小得多的列表!),它构建成功。我再次构建了一个 Nuget 包并将其安装到 ASP.NET Core 应用程序中。但是,关于 4.1.1.0 版,我又遇到了同样的错误。

这里是新类库的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 Core 应用程序中正常工作?

总结

我无法弄清楚 System.Net.Http 4.1.1.0 的引用位置,也无法让 ASP.NET Core 更新以使用比 4.0.0.0 更新的任何内容。但是,如果我将代码粘贴并直接在 ASP.NET Core 应用程序中下载依赖项,则一切正常。

有什么想法吗?

更新

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

【问题讨论】:

    标签: asp.net dll asp.net-core nuget-package asp.net-core-middleware


    【解决方案1】:

    好吧,我想通了。问题出在包Microsoft.AspNetCore.Authentication

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

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

    【讨论】:

      猜你喜欢
      • 2019-09-21
      • 2020-03-11
      • 1970-01-01
      • 1970-01-01
      • 2021-10-05
      • 2020-01-14
      • 1970-01-01
      • 2019-03-19
      • 1970-01-01
      相关资源
      最近更新 更多