我有一个奇怪的问题,这让我发疯了......
我有一个简单的类库项目(完整的.NET Framework,4.6.1),它包含一个围绕Cosmos DB的功能的包装类。因此,我已将“Microsoft.Azure.DocumentDB”NuGet Package 1.19.1添加到此项目中。除此之外,我引用了“Newtonsoft.Json”NuGet Package 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, Version = 4.2.0.0,Culture = neutral,PublicKeyToken = b03f5f7f11d50a3a'要么 其中一个依赖项。系统找不到指定的文件 Source = StackTrace:at Microsoft.Azure.Documents.Client.DocumentClient.Initialize(URI serviceEndpoint,ConnectionPolicy connectionPolicy,Nullable1 desiredConsistencyLevel) at Microsoft.Azure.Documents.Client.DocumentClient..ctor(Uri serviceEndpoint, String authKeyOrResourceToken, ConnectionPolicy connectionPolicy, Nullable
1 desiredConsistencyLevel)内部异常1:FileNotFoundException:无法加载文件或 assembly' System.Net.Http,Version = 4.0.0.0,Culture = neutral, 公钥= b03f5f7f11d50a3a'或其中一个依赖项。该 系统找不到指定的文件。
我完全不知道为什么根本找不到System.Net.Http程序集 - 我的类库项目中甚至有一个程序集引用到.Net Framework程序集“System.Net.Http 4.0.0.0”
我还不明白的是,有这种奇怪的绑定重定向到4.2.0.0 - 哪一个来自? 为了解决这个问题,我尝试将以下重定向添加到Service Fabric Service的app.config(使用类库):
但仍然没有区别,我仍然在运行时得到错误。
有人知道吗?有没有人见过这样的问题?
谢谢和问候, OliverB
答案 0 :(得分:90)
您遇到的问题与Visual Studio有关,尤其是2017年System.Net.Http v4.2.0.0
附带的问题。但是,采用通过NuGet进行任何引用的新方法,最新版本的System.Net.Http
4.3.3包含dll版本4.1.1.2。
问题是VS在构建时和运行时也会忽略你的引用,它会尝试引用它知道的DLL。
如何修复:
运行时错误:添加程序集绑定重定向
如果你在谷歌网上看到,你会发现微软有一些与此有关的未解决的问题,所以希望他们将来能解决这个问题。
希望这有帮助。
<强>更新强>
在查找针对此问题的某些永久性修补程序以处理构建代理时,请注意,如果迁移到新的NuGet PackageReference模型(在c:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\
而不在.csproj
中)往往会更好地工作。以下是有关如何进行此升级的指南的链接:https://docs.microsoft.com/en-us/nuget/reference/migrate-packages-config-to-package-reference
答案 1 :(得分:36)
删除绑定重定向对我有用,您可以尝试删除它:
<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />
答案 2 :(得分:6)
@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“:” An 错误发生。“,” 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位于 中的Company.Project.BackOffice.Web.Controllers.OrderController..ctor() C:\ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs:line 30 \ r \ n at lambda_method(Closure)\ r \ n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage 请求,HttpControllerDescriptor controllerDescriptor,类型 controllerType)“}}
当我开始查看程序集时,我可以看到我的Web项目和服务项目针对System.Net.Http
定位了不同的版本。
Web项目:
服务项目:
很容易认为这是由于版本不匹配引起的,但是这里的关键是查看错误The system cannot find the file specified.
。
查看path属性,我们可以看到Web项目针对.Net Framework程序集,而服务针对Visual Studio 2017中的程序集。由于服务器未安装Visual Studio 2017,因此将发生运行时错误。
Web路径:
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
这样简单的方法可以解决问题,但并非在所有情况下都可以解决。
为了在本地计算机上重现该错误,只需从Visual Studio特定文件夹中删除所需的System.Net.Http.dll
。这将给您运行时错误,可能还会出现一些构建错误。在解决这些问题之后,一切都应该工作,至少对我来说是有效的。
如果通过System.Net.Http
安装了NuGet
,请查看.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>
<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主题:
答案 3 :(得分:2)
我为解决此问题所做的工作已从web.config中删除了所有绑定,并做了
Update-Package -reinstall
这删除了一堆可能不需要的旧绑定,并且实际上进行了很好的清理。
答案 4 :(得分: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的程序集重定向
答案 5 :(得分:1)
当我将Web服务部署到我们的一台服务器时遇到了此错误。该项目针对的是.Net框架4.7.2,该框架尚未安装在服务器上。在服务器上安装4.7.2框架可解决此问题。
答案 6 :(得分:1)
我遇到了类似的问题。尝试删除 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
所有这些引用都改变了,没有绑定重定向,项目构建和运行。
答案 7 :(得分:1)
我刚刚使用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, 文化=中性,PublicKeyToken = b03f5f7f11d50a3a'或其中之一 依赖性。
在我的情况下,真正起作用的是打开.csproj文件并搜索System.Net.Http
,如以下屏幕截图所示……
请确保.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网站开始没有任何错误。
答案 8 :(得分:1)
经过几天的努力,我终于为我的项目解决了.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" />
答案 9 :(得分:0)
首先从本地文件系统中删除:
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\Syste.Net.Http.dll
然后删除Projects中的所有引用,并添加4.0引用。
这解决了我的问题。
答案 10 :(得分:0)
我使用的是 .net 4。我的“System.Net.Http”引用指向“.net 4.7”版本的 dll。所以我将 .dll 路径更改为指向“Microsoft.Net.Http”包并重建它。这解决了我的问题。
答案 11 :(得分:0)
我遇到了类似的问题,但解决了很多困难。我使用的是 Visual Studio 2019
Microsoft.AspNet.WebApi.Client
System.Net.Http
的引用,点击添加引用。System.Net.Http
和 System.Net.Http.Formatting
。点击添加后它工作正常。答案 12 :(得分:0)
我尝试了各种解决方案(删除了dependentAssembly或也指定了绑定重定向)。他们都没有工作。
但是,唯一对我有用的解决方案是从Visual Studio中将System.Net.Http的“特定版本”(或提供版本问题的任何DLL)显式设置为False。
答案 13 :(得分:0)
整夜,我们的应用程序停止将数据上传到我们的第三方提供商。 我目前正在使用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)
答案 14 :(得分:0)
上面有很多建议,这对我有用:
删除Nuget软件包4.3.4(我不得不降级需要它的另一个软件包)
添加System.Net.Http
作为参考(4.2.0.0版)
删除bindingRedirect
将System.Net.Http
添加到Web.config
中的编译部分。
<system.web>
<compilation debug="false" targetFramework="4.8">
<assemblies>
<add assembly="System.Net.Http, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/>
</assemblies>
</compilation>
<httpRuntime targetFramework="4.8"/>
</system.web>
如果有区域,请将其也添加到其Web.config中。至少我必须在代码中。
答案 15 :(得分:0)
我相信答案的一部分可以在微软的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
输出到垃圾箱。
还值得检查GAC来查看程序集是否也丢失了:
gacutil -l System.Net.Sockets
就我而言,GAC也缺少特定版本。如果DLL位于GAC中,则应该为found in the assembly binding process。
答案 16 :(得分:0)
我的解决方案类似于@Raquib的解决方案。我的项目是4.7.2,在我的PC上运行正常。每当我部署到开发服务器时,我都会得到问题中提到的问题。原来服务器上的.net最高版本是4.6.1。将项目降级到4.6.1可以解决此问题。对于我来说,升级服务器的.net版本不是我的选择。
答案 17 :(得分:0)
对我来说真的很奇怪。发现问题所在后,需要进行数小时的调试。它不是在本地发生,而是仅在使用jenkins构建项目时发生。
我有一个使用dotnet standart 2.0的小型库,主要项目是WCF项目,该项目基于普通的.NET(我的具体是v4.6.1)。但是在dotnet standart库的启动类中,我有一些看起来像这样的代码:
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; }
}
该接口位于dotnet标准库中,而实现不在它的外部(位于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项目传递到dotnet standart库,由于某些疯狂的原因dotnet standart不喜欢它,也许它认为HttpClient
来自不同的国家类,结果抛出System.Net.Http 4.x.x.x
找不到异常。删除代码后,它们不接受常规.NET项目中的HttpClient
,而是在库本身内部创建一个新的func
,这很高兴且可以正常工作。
希望这可能对其他人有所帮助,因为发生此错误的原因有很多:)
答案 18 :(得分:0)
我发现一个简单的解决方案将Web项目的目标框架降级到4.6。
我创建客户端和Web应用程序,具有.net Framework 4.7.1的客户端和具有相同功能的Web,并且面临相同的问题,当我降级Web的目标.net框架时,它对我有用。
答案 19 :(得分:0)
我遇到了同样的问题。最后,我通过将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)
我发现了一个4.2.0.0的System.Net.Http.dll,它是x64。在部署此脚本之前,将dll复制到包目录并更改配置文件以显式使用此文件。我还在http://gertjanvanmontfoort.blogspot.nl/2017/11/systemnethttp-dll-version-problems.html
写了一篇关于我的System.Net.Http问题的博客不要忘记用您自己的项目名称替换[ProjectName]
希望这有帮助,随时问