System.Net.Http 4.2.0.0 ile ilgili garip sorun bulunamadı


108

Beni deli eden garip bir sorun var ...

Cosmos DB etrafında işlevsellik için bir sarmalayıcı sınıfıyla basit bir Sınıf Kitaplığı Projem (Tam .NET Framework, 4.6.1) var. Bu nedenle bu projeye “Microsoft.Azure.DocumentDB” NuGet Paketi 1.19.1'i ekledim. Bunun dışında, "Newtonsoft.Json" NuGet Paketi 10.0.3'e ve ayrıca "Microsoft.Diagnostics.EventFlow. *" NuGet Paketlerine bir referansım var.

Şimdiye kadar her şey hatasız derleniyor.

Ancak, basit bir Service Fabric Stateless Service (Tam .NET Framework 4.6.1) tarafından tüketilen sarmalayıcı sınıfıma ulaşır ulaşmaz ve aşağıdaki kod satırını çalıştırmayı deneyin:

_docClient = new DocumentClient(new Uri(cosmosDbEndpointUrl), cosmosDbAuthKey);

Çalışma zamanında bu garip hatayı alıyorum:

System.IO.FileNotFoundException oluştu HResult = 0x80070002
Mesaj = Dosya veya derleme 'System.Net.Http, Sürüm = 4.2.0.0, Culture = nötr, PublicKeyToken = b03f5f7f11d50a3a' veya bağımlılıklarından biri yüklenemedi. Sistem belirtilen dosyayı bulamıyor.
Kaynak = StackTrace: Microsoft.Azure.Documents.Client.DocumentClient.Initialize (Uri 1 desiredConsistencyLevel) at Microsoft.Azure.Documents.Client.DocumentClient..ctor(Uri serviceEndpoint, String authKeyOrResourceToken, ConnectionPolicy connectionPolicy, NullableserviceEndpoint , ConnectionPolicy connectionPolicy, Nullable 1 istenilenConsistencyLevel)

İç İstisna 1: FileNotFoundException: Dosya veya derleme 'System.Net.Http, Sürüm = 4.0.0.0, Culture = nötr, PublicKeyToken = b03f5f7f11d50a3a' veya bağımlılıklarından biri yüklenemedi. Sistem belirtilen dosyayı bulamıyor.

System.Net.Http derlemesinin neden hiç bulunmadığına dair hiçbir fikrim yok - sınıf kitaplığı projemde .Net Framework Assembly "System.Net.Http 4.0.0.0" için bir montaj referansı bile var.

Benim de anlamadığım şey, 4.2.0.0'a bu garip bağlama yönlendirmesi var - bu nereden geliyor? Bunu aşmak için, Service Fabric Service'in app.config dosyasına (sınıf kitaplığını tüketen) aşağıdaki yönlendirmeyi eklemeye çalıştım:

Ama yine de fark yok, hala çalışma zamanında hatayı alıyorum.

Bir fikri olan var mı? Böyle bir sorunu gören var mı?

Teşekkürler ve saygılar, OliverB


3
Merhaba OliverB! Bu sorun için bir çözüm buldunuz mu? Sadece aynı durumla karşı karşıyayım ve bu bir kabus :-(
user1178399

@HansPassant şu bağlantı koptu
reggaeguitar

buna cevap
Mehdi

Yanıtlar:


129

Karşılaştığınız sorun Visual Studio ile ilgilidir, özellikle ile birlikte gelen 2017 System.Net.Http v4.2.0.0. Bununla birlikte, tüm referansların NuGet aracılığıyla yapılması gereken yeni yolu benimsemek, en son sürümü System.Net.Http4.3.3 dll sürüm 4.1.1.2'yi içerir.

Sorun şu ki, VS derleme zamanında ve çalışma zamanında da referansınızı yok sayacak ve bildiği DLL'ye başvurmaya çalışacaktır.

Nasıl düzeltilir?

  • System.Net.Http'ye yapılan tüm başvuruların NuGet aracılığıyla yapıldığından emin olun
  • Derleme zamanı hataları: VS 2017 ( c:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\) ile birlikte gelen System.Net.Http.dll uzantısını değiştirin (veya başka bir yere taşıyın ... temelde kurtulun ); farklı bir sürümünüz varsa, yol biraz farklı olacaktır.
  • Çalışma zamanı hataları: bir derleme bağlama yeniden yönlendirmesi ekleyin

Google'da çevrimiçi bakarsanız, Microsoft ile bu konuda birkaç açık sorun bulacaksınız, bu yüzden gelecekte bunu düzeltirler.

Bu yardımcı olur umarım.

Güncelleme:

Bu sorunun derleme aracılarında çalışması için bazı kalıcı düzeltmeler bulmaya bakarken, yeni NuGet PackageReference modeline geçerseniz (içinde .csprojdeğil packages.config) daha iyi çalışma eğiliminde olduğunu fark ettim . Bu yükseltmenin nasıl yapılacağına ilişkin kılavuzun bağlantısını burada bulabilirsiniz: https://docs.microsoft.com/en-us/nuget/reference/migrate-packages-config-to-package-reference



6
Son birkaç saattir bunu çözmeye çalışırken çıldırıyorum!
Flinkman

22
NET 4.7.2 ile çalışıyorsanız, bağlama Yönlendirmelerini gerçekten kaldırarak sorunun çözülebileceğini hatırlatmak isteriz.
Alternatex

1
Bugün 4.7.2'ye yükseltme yaparken aynı sorun. System.IO.Compression ve System.Runtime da etkilenmiştir. Bağlama yönlendirmelerinin kaldırılması sorunu çözdü.
JB. Monica ile.

7
Evet! En sonunda! Yukarıdaki @Alternatex ve JB uyarınca, 4.7.2 için bağlama Yönlendirmelerini kaldırın ve şimdi altın. System.Net.Http için gerekli olan en son şarkı ve dans rutinini bulmak her çerçeve güncellemesi için ne kadar acı verici.
Ted

76

Bağlama yönlendirmesini kaldırmak benim için çalıştı, kaldırmayı deneyebilirsiniz:

<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />

2
Bu denediğim ilk şeylerden biriydi, ancak başarılı olamadı
OliverB

2
BindingRedirect'i kaldırmak sorunu benim için çözdü. Birim testleri OP ile aynı hatayla geçmiyordu ve şimdi çalışıyorlar.
Edu

1
Bu tam kod hattı mı? Ve bunun tam olarak nereye eklenmesi gerekiyor? Diğer tüm bağlama yönlendirmelerim etikete sarılmışdependentAssembly
Flo

1
Bu harika çalıştı. Çözümünüzde birden fazla projeniz varsa, hepsini değerlendirdiğinizden ve bu yöntemi kullanarak çözdüğünüzden emin olun.
Scooter

1
Teşekkür ederim. Bu konuda 2 gündür takılıp kaldım. İşe yaradı !!!
Sagar Khatri

17

@AndreiU'nun zaten verdiği yanıta ve çalışma zamanı hatalarının yerel olarak nasıl yeniden üretileceğine bir ek.

Yerel olarak değil, Azure'a dağıtırken aşağıdaki çalışma zamanı hatasını aldım.

Dosya veya derleme 'System.Net.Http, Sürüm = 4.2.0.0, Culture = nötr, PublicKeyToken = b03f5f7f11d50a3a' veya bağımlılıklarından biri yüklenemedi. Sistem belirtilen dosyayı bulamıyor. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n şirketinde Company.Project .BackOffice.Web.Controllers.OrderController..ctor (), C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: lambda_method'da satır 30 \ r \ n Closure) \ r \ n System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create'de (HttpRequestMessage isteği, HttpControllerDescriptor controllerDescriptor, Type controllerType) "}} Kültür = nötr, PublicKeyToken = b03f5f7f11d50a3a 'veya bağımlılıklarından biri. Sistem belirtilen dosyayı bulamıyor. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n şirketinde Company.Project .BackOffice.Web.Controllers.OrderController..ctor (), C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: lambda_method'da satır 30 \ r \ n Closure) \ r \ n System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create'de (HttpRequestMessage isteği, HttpControllerDescriptor controllerDescriptor, Type controllerType) "}} Kültür = nötr, PublicKeyToken = b03f5f7f11d50a3a 'veya bağımlılıklarından biri. Sistem belirtilen dosyayı bulamıyor. "," ExceptionType ":" System.IO.FileNotFoundException "," StackTrace ":" Company.Project.Service.CompanyIntegrationApiService..ctor (Uri baseAddress) \ r \ n şirketinde Company.Project .BackOffice.Web.Controllers.OrderController..ctor (), C: \ projects \ company-project \ src \ Company.Project.BackOffice.Web \ Controllers \ Order \ OrderController.cs: lambda_method'da satır 30 \ r \ n Closure) \ r \ n System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create'de (HttpRequestMessage isteği, HttpControllerDescriptor controllerDescriptor, Type controllerType) "}}

Derlemelere bakmaya başladığımda, web projemin ve hizmet projemin farklı sürümleri hedeflediğini görebiliyordum System.Net.Http.

Web projesi:

görüntü açıklamasını buraya girin

Hizmet projesi:

görüntü açıklamasını buraya girin

Bunun sürümlerdeki uyumsuzluktan kaynaklandığını düşünmek kolaydır, ancak buradaki anahtar hataya bakmaktır The system cannot find the file specified..

Yol özelliğine baktığımızda, hizmet Visual Studio 2017'den bir derlemeyi hedeflerken web projesinin bir .Net Framework derlemesini hedeflediğini görebiliriz. Sunucuda Visual Studio 2017 yüklü olmadığı için çalışma zamanı hatası oluşacaktır.

Web yolu:

C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Net.Http.dll

Servis yolu:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\System.Net.Http.dll

Ayarlama gibi basit olarak bir şey Copy Localiçin trueher durumda ancak değil, sorunu çözebilirsiniz.

görüntü açıklamasını buraya girin

Yerel makinenizde hatayı yeniden oluşturmak için gerekli System.Net.Http.dllolanı Visual Studio'ya özgü klasörden kaldırmanız yeterlidir . Bu size çalışma zamanı hatası ve muhtemelen bazı yapı hataları verecektir. Bunlar düzeltildikten sonra her şey çalışmalı, en azından benim için oldu.

Eğer yüklediyseniz System.Net.Httpyoluyla NuGetçek montaj bakarak kullanılan .csprojsürümü. System.Net.Http 4.3.4örneğin aşağıdaki montajı verir:

<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 veya AppVey gibi bir derleme sunucusu kullanıyorsanız veya çalışma zamanı eksik .dllorada da olabilir. Bu durumda, System.Net.Http'nin NuGet sürümünü kullanmak veya eksikleri .dllyerel olarak silmek işe yaramayabilir . Bu hatayı çözmek için, bulunmayan ve belirli olan sürüme bakın PublicKeyToken. Bundan sonra, projenize bağlı olarak Web.configveya App.configprojenize bağlı olarak bir bağlama yönlendirmesi oluşturun . Benim durumumda bunun yerine 4.0.0.0'ı kullanmak istiyorum:

<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>

Sorunla ilgili iyi bir Github dizisi:

https://github.com/dotnet/corefx/issues/22781


4
<dependentAssembly> <assemblyIdentity name = "System.Net.Http" ....... eklemek benden çalışır. teşekkürler
Romeo

Benim için de! Çözüm için teşekkürler! oldVersion = "0.0.0.0-4.2.0.0" newVersion = "4.1.1.3" kullanıyorum çünkü 4.1.1.3
Pavel Yermalovich

4.0.0.0'a yönlendirme beni zirveye taşıyan şeydi. Teşekkürler!
Jim G.

Yönlendirmek tehlikelidir! Projenizde 4.2 kullandığını belirten bir bağımlılığınız var, ancak onu 4.0 kullanmaya zorluyorsunuz. 4.0'dan sonra tanıtılan yeni özelliklerden veya yöntemlerden herhangi birini kullanıyorsa, tahmin edilmesi zor olan bir çalışma zamanı hatası alırsınız.
David Burg

Github iş parçacığının bağlantısı kesildi. Ancak aşağıdaki ileti dizisi ilgili tartışmayı içeriyor gibi görünüyor: github.com/dotnet/runtime/issues/24382
Hermann.Gruber

5

System.Net.HttpNuGet kullanarak yeni kurdum . Buradan alabilirsiniz:

https://www.nuget.org/packages/System.Net.Http/

ASP.NET MVCProje ben hedeflere üzerinde çalışıyorum .NET 4.6.1. IIS ExpressVisual Studio 2019 ile hata ayıklarken makinemde mükemmel çalışıyor .

Azure'a dağıtılan uygulamayı çalıştırmaya çalışırken sorun oluştu. Şu hatayı alıyordum:

Dosya veya derleme 'System.Net.Http, Sürüm = 4.2.0.0, Culture = nötr, PublicKeyToken = b03f5f7f11d50a3a' veya bağımlılıklarından biri yüklenemedi.

Benim durumumda gerçekten işe yarayan şey, .csproj dosyasını açmak System.Net.Httpve aşağıdaki ekran görüntüsünde benzerleri aramaktı ...

görüntü açıklamasını buraya girin

.csprojDosyanın şu sürüme sahip olduğuna bakın 4.1.1.3:

<Reference Include="System.Net.Http, Version=4.1.1.3, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">

<HintPath>Aslında noktaları ..\packagesolan Nuget gelen klasöründe, bu Nuget tarafından yüklenen gerçek versiyonu. Dağıtıldıktan sonra bu belirli sürüm, sunucu tarafında da geri yüklenecek ve her şey bir bağlama yönlendirmesiyle çalışmalıdır.

... ve bu nedenle, bağlama yönlendirmesi bu özel sürümden şu şekilde bahsetmelidir 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>

Bu, Azure Kudu'ya birkaç işlem yaptıktan sonra benim durumumdaki sorunu çözdü . Azure web sitesi nihayet hatasız başladı.


4

Sorunu düzeltmek için yaptığım şey, web.config dosyasındaki tüm bağlamaları kaldırdım ve bir

Update-Package -reinstall

Bu, muhtemelen orada olması gerekmeyen ve aslında iyi bir temizlik yapan bir grup eski bağları kaldırdı.


2

Sunucularımızdan birine bir web hizmeti dağıttığımda bu hatayla karşılaştım. Proje, sunucuda kurulu olmayan .Net framework 4.7.2'yi hedefledi. 4.7.2 çerçevesini sunucuya yüklemek sorunu düzeltti.


Bu benim de sorunumdu. Diğer sürümler için de yinelenen bir konudur.
Jason Geiger

2

Andrei U'nun cevabı kurtuluşuma götürdü. Ancak, neden benim davamla uyuşmadı. Benimle aynı senaryoda olan insanlar için:

Bu, derlemenin başarılı olduğu, ancak sunucuda değil bir bilgisayarda çalıştığı bir çalışma zamanı hatasıydı (derleme zamanı değil). Çözüm: - System.Net.Http paketi eklendi. - Dosyayı yeniden adlandırın: C: \ Program Files (x86) \ Reference Assemblies \ Microsoft \ Framework.NETFramework \ v4.7.2 \ System.Net.Http.dll (örn. Yeniden adlandırın: System.Net.Http.dll.BAK) sunucu oluşturun.

Bu dll için derleme yönlendirmelerine sahip değildim ve hala yok


1

Basit bir çözüm buldum, web projesi için hedef çerçeveyi 4.6'ya düşürdü.

İstemci ve web uygulaması oluşturuyorum, istemci .net framework 4.7.1 ve web'de aynı ve web için hedef .net çerçevesini düşürdüğümde aynı sorunla karşılaşıyorum, bu benim için çalışıyor.


1

Bununla birkaç gün uğraştıktan sonra nihayet projem için .Net 4.7.2 / System.Net.Http problemini çözdüm. 4.7.2 çerçeve sürümünü hedeflemek için * .csproj dosyasını değiştirmeye ek olarak, projelerde app.config dosyasını da

<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />

to:

<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" />

0

Ben de aynı sorunu yaşadım. Sonunda Deploy-FabricApplication.ps1'i böyle bir şeye değiştirerek çözdüm

$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 olan bir 4.2.0.0 System.Net.Http.dll buldum. Bu betiği konuşlandırmadan önce dll'yi paket dizinine kopyalar ve bu dosyayı açıkça kullanmak için yapılandırma dosyasını değiştirir. Ayrıca http://gertjanvanmontfoort.blogspot.nl/2017/11/systemnethttp-dll-version-problems.html adresinde System.Net.Http sorunlarım hakkında bir blog yazdım.

[ProjeAdı] 'nı kendi proje adınızla değiştirmeyi unutmayın

Umarım bu yardımcı olur, sormaktan çekinmeyin


0

Benim için gerçekten tuhaf bir şeydi. Sorunun ne olduğunu bulduktan sonra saatlerce hata ayıklama yapılması gerekiyor. Yerel olarak olmadı, ancak yalnızca projeyi oluşturmak için jenkins kullanıldığında.

Dotnet standart 2.0 kullanan küçük bir kütüphanem vardı ve ana proje normal .NET tabanlı WCF projesiydi (benimki özellikle v4.6.1 idi). Ama dotnet standart kütüphanesinin başlangıç ​​sınıfında şuna benzeyen bir kod vardı:

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 arayüzü aşağıdaki gibi görünür:

public interface IStaticDataConfiguration
{
    //..... some stuff

    Func<HttpClient> ClientResolver { get; set; }
}  

Bu arayüz, uygulama dışında iken dotnet standart kütüphanesinin içinde bulunur (WCF projesinde bulunur).

Kütüphanenin dışından AddStaticDataConfigurationyöntemi aşağıdaki gibi çağırıyordum :

serviceCollection.AddStaticDataConfiguration(p =>
{
    var staticDataConfig = p.GetService<IStaticDataConfiguration>();
    return new StaticDataProviderConfiguration
    {
        //...some other stuff
        ClientResolver = () => restRequestFactory.GetInstrumentedClient("StaticDataService") //this returns an HttpClient
    };
});

Sorun şu ki Func<HttpClient>, normal bir .NET projesinden bir dotnet standart kütüphanesine geçiyorum ki bu çılgın bir nedenden dolayı dotnet standarttan hoşlanmıyor ve belki de HttpClientfarklı sınıflardan geldiğini düşündüğü için System.Net.Http 4.x.x.xistisna bulunmadı. HttpClientNormal bir .NET projesinden bir kabul etmemek için kod kaldırıldığında, ancak funckitaplığın içinde yeni bir tane oluşturmak mutlu ve çalışıyor. Bu hata pek çok nedenden dolayı meydana geldiğinden, bunun başka birine yardımcı olabileceğini umuyoruz :)


0

Çözümüm @ Raquib'inkine benziyordu. Projem 4.7.2 idi ve bilgisayarımda gayet iyi çalıştı. Dev sunucumuza her dağıttığımda, soruda bahsedilen sorunu alıyordum. Sunucudaki en yüksek .net sürümünün 4.6.1 olduğu ortaya çıktı. Projemi 4.6.1'e düşürmek sorunu çözdü. Sunucunun .net sürümünü yükseltmek benim için bir seçenek değildi.


0

Cevabın bir kısmının Microsoft'un belgelerinde bulunabileceğine inanıyorum .

Visual Studio'da .NET Framework 4.5.1 veya sonraki bir sürümü hedefleyen bir masaüstü uygulaması oluşturduğunuzda, uygulama otomatik bağlama yeniden yönlendirmesini kullanır.

@Vivek Sharma'nın cevabının işaret ettiği gibi, kaldırarak:

<bindingRedirect oldVersion="0.0.0.0-4.2.0.0" newVersion="4.2.0.0" />

sorunu uygulamamda bu tür 3 durumda çözdüm. DLL'yi Powershell ile incelediğinizde, örneğin:

 ([system.reflection.assembly]::loadfile("C:\MyApp\bin\System.Net.Sockets.dll")).FullName

çıktılar

System.Net.Sockets, Sürüm = 4.0.0.0

Açıkçası bir bağlama yönlendirmesi 4.2.0.0işe yaramayacak çünkü 4.0.0.0çöp kutusuna çıkış yapıyoruz .

Ayrıca montajın oradan da eksik olup olmadığını görmek için GAC'yi kontrol etmeye değer:

 gacutil -l System.Net.Sockets

Benim durumumda, belirli bir sürüm de GAC'de eksikti. DLL GAC içindeyse , derleme bağlama işleminde bulunması gerekirdi .


-2

Önce yerel dosya sisteminizden silin:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\Microsoft\Microsoft.NET.Build.Extensions\net461\lib\Syste.Net.Http.dll

Ardından Projelerdeki tüm referansları kaldırın ve 4.0 referansı ekleyin.
Bu benim için sorunumu çözdü.


3
aman hayır, lütfen VS kurulumunuzu bazı dosyalarını silerek bozmayın.
David Burg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.