我有一个奇怪的问题,这让我发疯......
我有一个简单的类库项目(完整的 .NET Framework,4.6.1),其中包含一个用于 Cosmos DB 功能的包装类。因此,我将“Microsoft.Azure.DocumentDB”NuGet Package 1.19.1 添加到该项目中。除此之外,我还引用了“Newtonsoft.Json”NuGet 包 10.0.3,以及几个“Microsoft.Diagnostics.EventFlow.*”NuGet 包。
到目前为止,一切都编译没有任何错误。
但只要我点击我的包装类——从一个简单的 Service Fabric 无状态服务(完整的 .NET Framework 4.6.1)消耗——并尝试执行以下代码行:
_docClient = new DocumentClient(new Uri(cosmosDbEndpointUrl), cosmosDbAuthKey);
我在运行时收到这个奇怪的错误:
System.IO.FileNotFoundException 发生 HResult=0x80070002 消息=无法加载文件或程序集“System.Net.Http,版本=4.2.0.0,文化=中性,PublicKeyToken=b03f5f7f11d50a3a”或其依赖项之一。该系统找不到指定的文件。 Source= StackTrace:在 Microsoft.Azure.Documents.Client.DocumentClient.Initialize(Uri serviceEndpoint, ConnectionPolicy connectionPolicy, Nullable1 desiredConsistencyLevel) 在 Microsoft.Azure.Documents.Client.DocumentClient..ctor(Uri serviceEndpoint, String authKeyOrResourceToken, ConnectionPolicy connectionPolicy, Nullable1 desiredConsistencyLevel) 内部异常 1:FileNotFoundException:无法加载文件或程序集 'System.Net.Http,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。该系统找不到指定的文件。
我完全不知道为什么根本找不到 System.Net.Http 程序集——在我的类库项目中甚至有一个对 .Net Framework 程序集“System.Net.Http 4.0.0.0”的程序集引用。
我也不明白的是,有一个奇怪的绑定重定向到 4.2.0.0——那个是从哪里来的?为了解决这个问题,我尝试将以下重定向添加到 Service Fabric 服务的 app.config(它正在使用类库):
但仍然没有区别,我仍然在运行时收到错误。
有人有线索吗?有人见过这样的问题吗?
您面临的问题与 Visual Studio 有关,尤其是与 System.Net.Http v4.2.0.0
一起提供的 2017。但是,采用新的方式,任何引用都应该通过 NuGet 完成,最新版本的 System.Net.Http
是 4.3.3 包含 dll 版本 4.1.1.2。
问题是 VS 在构建时和运行时也会忽略您的引用,它会尝试引用它知道的 DLL。
如何修复它:
确保对 System.Net.Http 的任何引用都是通过 NuGet 完成的
构建时错误:更改随 VS 2017 (c:\Program Files (x86)\Microsoft Visual Studio\2017 \Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\);如果你有不同的版本,那么路径会略有不同,但差别不大
运行时错误:添加程序集绑定重定向
如果您在 google 上在线查找,您会发现 Microsoft 对此存在一些未解决的问题,因此希望他们将来会解决此问题。
希望这可以帮助。
更新:
在寻找针对此问题的一些永久性修复以在构建代理上运行时,注意到如果您迁移到新的 NuGet PackageReference 模型(在 .csproj
中而不是在 packages.config
中)往往会更好地工作。以下是有关如何进行此升级的指南的链接:https://docs.microsoft.com/en-us/nuget/reference/migrate-packages-config-to-package-reference
删除绑定重定向对我有用,您可以尝试删除它:
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
dependentAssembly
中
@AndreiU 已经给出的答案以及如何在本地重现运行时错误的补充。
部署到 Azure 时出现以下运行时错误,而不是本地。
{“Message”:“发生错误。”,“ExceptionMessage”:“尝试创建'OrderController'类型的控制器时发生错误。确保控制器具有无参数的公共构造函数。”,“ExceptionType”: "System.InvalidOperationException","StackTrace":" 在 System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor controllerDescriptor,类型 controllerType)\r\n 在 System.Web.Http.Controllers.HttpControllerDescriptor.CreateController( HttpRequestMessage 请求)\r\n 在 System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext()","InnerException":{"Message":"发生错误。","ExceptionMessage":"无法加载文件或程序集 'System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。系统找不到指定的文件。","ExceptionType":"System.IO.FileNotFoundException ","StackTrace":" 在 Company.Project.Service.CompanyIntegrationApiService ..ctor(Uri baseAddress)\r\n 在 C:\projects\company-project\src\Company.Project.BackOffice.Web\Controllers 中的 Company.Project.BackOffice.Web.Controllers.OrderController..ctor() Order\OrderController.cs:line 30\r\n at lambda_method(Closure )\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)"}}
当我开始查看程序集时,我可以看到我的 Web 项目和服务项目针对 System.Net.Http
的不同版本。
网络项目:
https://i.stack.imgur.com/Zid7c.png
服务项目:
https://i.stack.imgur.com/eS0SH.png
很容易认为这是由于版本不匹配造成的,但这里的关键是查看错误 The system cannot find the file specified.
。
查看 path 属性,我们可以看到 Web 项目以 .Net Framework 程序集为目标,而服务以 Visual Studio 2017 的程序集为目标。由于服务器未安装 Visual Studio 2017,因此会发生运行时错误。
网页路径:
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Net.Http.dll
服务路径:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.Net.Http.dll
将 Copy Local
设置为 true
这样简单的操作可以解决问题,但并非在所有情况下都适用。
https://i.stack.imgur.com/vnX5w.png
为了在本地计算机上重现错误,只需从 Visual Studio 特定文件夹中删除所需的 System.Net.Http.dll
。这会给你运行时错误,可能还有一些构建错误。在这些被修复之后,一切都应该工作,至少它对我有用。
如果您通过 NuGet
安装了 System.Net.Http
,请查看 .csproj
版本检查使用的程序集。 System.Net.Http 4.3.4
给出了以下程序集,例如:
<Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll</HintPath>
<Private>True</Private>
</Reference>
如果您使用像 Jenkins、TeamCity 或 AppVeyor 这样的构建服务器,那么缺少的运行时 .dll
也可能存在。在这种情况下,使用 NuGet 版本的 System.Net.Http 或在本地删除缺少的 .dll
可能无济于事。要解决此错误,请查看未找到的版本和特定的 PublicKeyToken
。之后,根据您的项目在 Web.config
或 App.config
中创建绑定重定向。就我而言,我想改用 4.0.0.0 :
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
关于这个问题的一个很好的 Github 线程:
https://github.com/dotnet/corefx/issues/22781
我刚刚使用 NuGet 安装了 System.Net.Http
。你可以在这里抓住它:
https://www.nuget.org/packages/System.Net.Http/
我正在处理的 ASP.NET MVC
项目以 .NET 4.6.1
为目标。在使用 Visual Studio 2019 在 IIS Express
中进行调试时,它可以在我的机器上完美运行。
尝试运行部署到 Azure 的应用程序时出现问题。我收到了这个错误:
无法加载文件或程序集 'System.Net.Http, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' 或其依赖项之一。
在我的情况下真正起作用的是打开 .csproj 文件并搜索 System.Net.Http
,如下面的屏幕截图所示......
https://i.stack.imgur.com/JObUK.jpg
看到 .csproj
文件具有版本 4.1.1.3
:
<Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
<HintPath>
实际上指向Nuget中的..\packages
文件夹,也就是Nuget安装的真实版本。部署后,此特定版本也将在服务器端恢复,并且所有内容都应使用绑定重定向。
...因此 绑定重定向 应在 Web.config
中提及此特定版本,如下所示:
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.1.1.3" />
</dependentAssembly>
这在我提交了几次 Azure Kudu 后解决了我的问题。 Azure 网站终于启动,没有出现任何错误。
我为解决这个问题所做的工作是从 web.config 中删除了所有绑定并做了一个
Update-Package -reinstall
这删除了一堆可能不需要在那里的旧绑定,实际上做了很好的清洁。
当我将 Web 服务部署到我们的一台服务器时,我遇到了这个错误。该项目针对未安装在服务器上的 .Net 框架 4.7.2。在服务器上安装 4.7.2 框架更正了该问题。
Andrei U 的回答导致了我的救赎。但是,推理与我的情况不符。对于与我处于相同情况的人:
这是一个运行时错误(不是构建时间),构建成功,但可以在一台计算机上运行,但不能在服务器上运行。解决方案: - 添加 System.Net.Http 包。 - 重命名文件:C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.7.2\System.Net.Http.dll(例如重命名为:System.Net.Http.dll.BAK)构建服务器。
我没有并且仍然没有此 dll 的程序集重定向
我相信部分答案可以在微软的documentation中找到。
在 Visual Studio 中创建面向 .NET Framework 4.5.1 或更高版本的桌面应用时,该应用使用自动绑定重定向。
正如@Vivek Sharma 的回答所指出的,删除:
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
在我的应用程序中解决了 3 个此类情况下的问题。当您使用 Powershell 检查 DLL 时,例如:
([system.reflection.assembly]::loadfile("C:\MyApp\bin\System.Net.Sockets.dll")).FullName
输出
System.Net.Sockets,版本=4.0.0.0
显然,绑定重定向到 4.2.0.0
不起作用,因为我们将 4.0.0.0
输出到 bin。
还值得检查 GAC 以查看那里是否也缺少程序集:
gacutil -l System.Net.Sockets
就我而言,GAC 也缺少特定版本。如果 DLL 在 GAC 中,那么它应该是 found in the assembly binding process。
除了上面的许多建议外,这对我有用:
删除 Nuget 包 4.3.4(我不得不降级另一个需要它的包)添加 System.Net.Http 作为参考(版本 4.2.0.0) 删除 bindingRedirect 将 System.Net.Http 添加到 Web.config 中的编译部分.
如果您有区域,请将其添加到其 Web.config 中。至少我必须在我的代码中。
我发现一个简单的解决方案是将 Web 项目的目标框架降级到 4.6。
我创建客户端和 Web 应用程序,客户端具有 .net 框架 4.7.1,而 Web 具有相同的框架,我面临同样的问题,当我为 Web 降级目标 .net 框架时,它对我有用。
我的解决方案类似于@Raquib 的。我的项目是 4.7.2,在我的 PC 上运行良好。每当我部署到我们的开发服务器时,我都会遇到问题中提到的问题。原来服务器上的最高 .net 版本是 4.6.1。将我的项目降级到 4.6.1 解决了这个问题。升级服务器的 .net 版本对我来说不是一个选择。
我尝试了各种解决方案(删除dependentAssembly 或指定绑定重定向)。他们都没有工作。
但是,唯一对我有用的解决方案是从 Visual Studio 将 System.Net.Http (或任何给您版本问题的 DLL)的特定版本显式设置为 False。
https://i.stack.imgur.com/UW8qs.png
我遇到了类似的问题,并遇到了很多困难解决了它。我正在使用 Visual Studio 2019
删除对 System.Net 的任何程序集引用。*(任何以 System.Net 开头的包)卸载所有以 System.Net 开头的包。* 从包管理器安装 Microsoft.AspNet.WebApi.Client 以上应该可以解决您的问题。无论如何,您仍然有问题。 Intellisense 会建议您添加对 System.Net.Http 的引用,单击添加引用。就我而言,它建议两个参考 System.Net.Http 和 System.Net.Http.Formatting。单击添加后,它工作正常。
我有一个类似的问题。尝试删除 System.Net.Http NuGet 包(版本 4.1.1.2)失败,因为它被标记为我正在使用的其他包的先决条件。
我尝试删除此处的几个答案中提到的所有绑定重定向。虽然这本身不起作用,但我继续进行以下操作。
在我所有项目下的 References 节点中,我从 NuGet 包中删除了指向 System.Net.Http.dll 的链接,并从 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4 添加了一个。 6.1\System.Net.Http.dll
随着所有这些引用的更改并且没有绑定重定向构建和运行的项目。
我有同样的问题。最后,我通过将 Deploy-FabricApplication.ps1 更改为类似这样的方式解决了这个问题
$binFolder = "$LocalFolder\..\..\..\..\Bin"
$httpDllLocation = "$binFolder\System.Net.Http.dll"
$codeFolder = "$ApplicationPackagePath\[ProjectName].ServicesPkg\Code"
$configFile = "$codeFolder\[ProjectName].Services.exe.config"
Copy-Item $httpDllLocation -Destination $codeFolder
$appConfig = [xml](cat $configFile)
$appConfig.configuration.runtime.assemblyBinding.dependentAssembly | foreach {
$name = $_.assemblyIdentity.name
#Write $name
if($name -eq 'System.Net.Http')
{
Write 'System.Net.Http changed'
$_.bindingRedirect.newVersion = '4.2.0.0'
}
}
$appConfig.Save($configFile)
我找到了一个 x64 的 4.2.0.0 System.Net.Http.dll。在部署此脚本之前,将 dll 复制到包目录并更改配置文件以显式使用此文件。我还在 http://gertjanvanmontfoort.blogspot.nl/2017/11/systemnethttp-dll-version-problems.html 写了一篇关于我的 System.Net.Http 问题的博客
不要忘记将 [ProjectName] 替换为您自己的项目名称
希望对你有帮助,欢迎提问
经过几天的努力,我终于为我的项目解决了 .Net 4.7.2/System.Net.Http 问题。除了将 *.csproj 文件更改为以框架版本 4.7.2 为目标之外,我还必须更新项目中的 app.config
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
至:
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />
一夜之间,我们的应用程序停止向我们的第三方提供商上传数据。我目前正在使用 VS 2017 15.9.27 并且我的错误“进程失败:底层连接已关闭:发送时发生意外错误。”来自这一行:
Dim stream As IO.Stream = request.GetRequestStream
来自此的请求:
Dim request As Net.HttpWebRequest = Net.HttpWebRequest.Create(uri)
我做了两件事来解决这个问题。我将 .NET 的最新版本升级到 4.6.1,现在产生了以下错误:
"Could not load file or assembly 'System.Net.Http, Version=4.2.0.0,"
为了解决新创建的问题,我删除了包“System.Net.Http”,而是通过 NuGet 将其添加回 4.3.4。
我怀疑它可能是证书或协议问题,因为它安装了以下以前不存在的安全参考:
System.Security.Cryptography.Algorithms (>= 4.3.0)
System.Security.Cryptography.Encoding (>= 4.3.0)
System.Security.Cryptography.Primitives (>= 4.3.0)
System.Security.Cryptography.X509Certificates (>= 4.3.0)
对我来说,这真的很奇怪。发现问题后需要数小时的调试。它并没有在本地发生,而是仅在使用 Jenkins 构建项目时发生。
我有一个使用 netstandard 2.0 的小型库,主要项目是基于普通 .NET 的 WCF 项目(我的特别是 v4.6.1)。但是在 netstandard 库的启动类中,我有一些看起来像这样的代码:
public static class CoreModule
{
public static IServiceCollection AddStaticDataConfiguration(
this IServiceCollection services, Func<IServiceProvider, IStaticDataConfiguration> staticDataConfiguration)
{
services.TryAddSingleton(staticDataConfiguration);
services.TryAddSingleton<Func<HttpClient>>(x =>
{
var configuration = staticDataConfiguration(x);
return configuration.ClientResolver ?? (() => new HttpClient());
});
return services;
}
}
IStaticDataConfiguration 接口如下所示:
public interface IStaticDataConfiguration
{
//..... some stuff
Func<HttpClient> ClientResolver { get; set; }
}
该接口位于 netstandard 库内部,而实现位于其外部(位于 WCF 项目中)。
我从库外部调用 AddStaticDataConfiguration
方法,如下所示:
serviceCollection.AddStaticDataConfiguration(p =>
{
var staticDataConfig = p.GetService<IStaticDataConfiguration>();
return new StaticDataProviderConfiguration
{
//...some other stuff
ClientResolver = () => restRequestFactory.GetInstrumentedClient("StaticDataService") //this returns an HttpClient
};
});
问题是我将 Func<HttpClient>
从普通 .NET 项目传递到 netstandard 库,由于某种疯狂的原因 netstandard 不喜欢它,也许它认为 HttpClient
来自不同的类,结果抛出 System.Net.Http 4.x.x.x
未发现异常。当删除代码以不接受来自普通 .NET 项目的 HttpClient
但在库本身内创建新的 func
时,它很高兴并且工作正常。希望这可能对其他人有所帮助,因为发生此错误的原因有很多:)
我使用的是 .net 4。我的“System.Net.Http”引用指向 dll 的“.net 4.7”版本。所以我将 .dll 路径更改为指向“Microsoft.Net.Http”包并重建它。这解决了我的问题。
https://i.stack.imgur.com/PaeqD.png
解决方案在多台开发机器上编译和运行良好,除了在运行项目时出现此错误的机器。删除所有文件并从 TFS 中检索它们没有帮助。
Visual Studio 修复解决了它。
从 Visual Studio 安装程序执行修复。
Visual Studio 2019 版本 16.11.5
就我而言,我从 .config
文件中删除了 <runtime>
标记下的所有依赖项及其绑定重定向。我构建了给我绑定错误的解决方案。单击错误,VS 仅根据需要填充依赖项及其重定向,并且能够在之后运行解决方案。
对我有用的是将 System.Net.Http 降级到 4.0 版,以便所有包和依赖项都使用相同的版本:
<dependentAssembly>
<assemblyIdentity name="System.Net.Http" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
我从 C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Microsoft\Microsoft.NET.Build.Extensions
和 C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework
的所有子文件夹中删除了 System.Net.Http.dll。
作为一种解决方法,我安装了 System.Buffer 4.5.0 版本,它依赖于 System.Net.Http dll 版本 4.2.0.0。因此,安装后,您将在项目的 bin 文件夹中看到具有上述版本的 System.Net.Http dll。对于此类问题,这是一个简单的解决方法。
首先从本地文件系统中删除:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\Syste.Net.Http.dll
然后删除项目中的所有引用,并添加 4.0 引用。这解决了我的问题。
不定期副业成功案例分享