背景
我正在尝试编写一些中间件来使用 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.Authentication
Nuget 包上。每次安装时,它都会破坏新版本的System.Net.Http
. 关于如何防止这种情况的任何想法?