我试图编写一些中间件来使用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 Packages和我的专有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
当然,我查看了类库中的System.Net.Http
依赖项。它在Nuget包中下拉,适当地命名为System.Net.Http
。我成功地将该软件包安装到ASP.NET Core应用程序(或者它告诉我)。我运行了应用程序,中间件失败了同样的错误。很困惑,我回去看了看Nuget的包裹。 System.Net.Http
失踪了!我再次安装了#34;成功",但再次搜索包显示它没有安装。
我禁用了自动包恢复,我清除了Nuget缓存,然后再次尝试。没运气。该软件包认为它已成功安装,但它从未真正起作用。
这是ASP.NET核心应用程序项目的相关部分.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": { }
}
}
我想到我可能错误地设置了类库。所以我去了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
的新版本。关于如何预防的任何想法?
答案 0 :(得分:0)
好吧,我明白了。这是问题所在的包Microsoft.AspNetCore.Authentication
。
缩小范围后,看起来微软已经意识到了这个问题:https://github.com/aspnet/Security/issues/1046。他们会在一个月内发布修复,听起来像是。
以下是修复它的提交:https://github.com/aspnet/Security/commit/0f429324c54e380eeed235fea2bdfabb3639f43e