1

背景

我正在尝试编写一些中间件来使用 ASP.NET Core 进行自定义身份验证。因为我依赖于一些使用 .NET 框架的专有代码,所以我使用的是 ASP.NET Core 的 .Net Framework 版本,而不是 ASP.NET Core 的 .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.AuthenticationNuget 包上。每次安装时,它都会破坏新版本的System.Net.Http. 关于如何防止这种情况的任何想法?

4

1 回答 1

0

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

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

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

于 2017-02-07T17:43:40.403 回答