System.Net.ttp के साथ अजीब समस्या 4.2.0.0 नहीं मिली




visual-studio-2017 dotnet-httpclient (9)

मेरे लिए काम कर रहे बाध्यकारी पुनर्निर्देशन को हटाना, आप इसे हटाने की कोशिश कर सकते हैं:

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

मेरे पास एक अजीब मुद्दा है, जो मुझे पागल कर देता है ...

मेरे पास एक साधारण क्लास लाइब्रेरी प्रोजेक्ट (पूर्ण .NET फ्रेमवर्क, 4.6.1) है, जो कॉस्मॉस डीबी के चारों ओर कार्यक्षमता के लिए एक आवरण वर्ग के साथ है। इसलिए मैंने इस परियोजना में "Microsoft.Azure.DocumentDB" NuGet पैकेज 1.19.1 जोड़ा है। इसके अलावा, मेरे पास "न्यूटनसॉफ्ट.जॉन" नुगेट पैकेज 10.0.3 का संदर्भ है, साथ ही "Microsoft.Diagnostics.EventFlow। *" नुगेट पैकेज के एक जोड़े के लिए भी है।

अब तक, सब कुछ बिना किसी त्रुटि के संकलन करता है।

लेकिन जैसे ही मैंने अपना रैपर वर्ग मारा - एक साधारण सेवा वाले कपड़े स्टेटलेस सर्विस (पूर्ण .NET फ्रेमवर्क 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 कनेक्शन पर, मसालेदार, Nullable 1 desiredConsistencyLevel) at Microsoft.Azure.Documents.Client.DocumentClient..ctor(Uri serviceEndpoint, String authKeyOrResourceToken, ConnectionPolicy connectionPolicy, Nullable 1 वांछित

इनर एक्सेप्शन 1: FileNotFoundException: फाइल या असेंबली को लोड नहीं कर सका 'System.Net.Http, वर्जन = 4.0.0.0, कल्चर = न्यूट्रल, PublicKeyToken = b03f5f7f11d50aa' या इसकी एक निर्भरता। सिस्टम निर्दिष्ट फाइल का पता लगाने में नाकामयाब रहा।

मेरे पास कोई सुराग नहीं है, क्यों System.Net.Http असेंबली बिल्कुल नहीं मिली है - यहां तक ​​कि मेरी क्लास लाइब्रेरी प्रोजेक्ट में .Net फ्रेमवर्क असेंबली "System.Net.Http 4.0.0.0" के लिए एक विधानसभा संदर्भ भी है।

जो मुझे समझ में नहीं आ रहा है, वह यह है कि यह अजीब तरह के बंधन को 4.2.0.0 पर पुनर्निर्देशित करता है - वह कहां से आ रहा है? इस एक के आसपास पाने के लिए, मैंने ऐप को निम्नलिखित रीडायरेक्ट को जोड़ने की कोशिश की। सर्विस फैब्रिक सर्विस (जो क्लास लाइब्रेरी का उपभोग कर रही है) से संपर्क करें:

लेकिन अभी भी कोई अंतर नहीं है, मुझे अभी भी रनटाइम में त्रुटि मिलती है।

किसी को कोई सुराग है? किसी को भी इस तरह के मुद्दे को देखा है?

धन्यवाद और का संबंध है, OliverB


मेरा समाधान @ रकीब के समान था। मेरी परियोजना 4.7.2 थी और मेरे पीसी पर ठीक काम किया। जब भी मैं अपने देव सर्वर पर तैनात होता तो मुझे प्रश्न में उल्लेखित मुद्दा मिल जाता। सर्वर पर उच्चतम .net संस्करण निकला 4.6.1 था। मेरी परियोजना को 4.6.1 में अपग्रेड करने से समस्या का समाधान हो गया। सर्वर के -net संस्करण को अपग्रेड करना मेरे लिए कोई विकल्प नहीं था।


आपके द्वारा सामना की जा रही समस्या विज़ुअल स्टूडियो से संबंधित है, विशेष रूप से 2017 जो System.Net.Http v4.2.0.0 साथ भेज System.Net.Http v4.2.0.0 । हालाँकि, न्यूगेट के माध्यम से नए तरीके को अपनाना चाहिए, जिसे System.Net.Http नवीनतम संस्करण के माध्यम से किया जाना चाहिए, जो कि 4.3.3 है जिसमें dll संस्करण 4.1.1.2 है।

समस्या यह है कि वीएस बिल्ड टाइम और रन टाइम के साथ-साथ आपके संदर्भ को नजरअंदाज कर देगा और यह DLL के बारे में जानने की कोशिश करेगा।

इसे कैसे जोड़ेंगे:

  • सुनिश्चित करें कि System.Net.Http के किसी भी संदर्भ को NuGet के माध्यम से किया जाता है
  • समय त्रुटियों का निर्माण करें: System.Net.Http.dll का विस्तार एक्सटेंशन बदलें (या इसे कहीं और ले जाएं ... मूल रूप से इससे छुटकारा पाएं) जिसे वीएस 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 में नहीं ।config) बेहतर काम करता है। इस अपग्रेड को करने के लिए गाइड का लिंक यहां दिया गया है: https://docs.microsoft.com/en-us/nuget/reference/migrate-packages-config-to-package-reference


मैंने अभी-अभी NuGet का उपयोग करके System.Net.Http स्थापित किया है। आप इसे यहाँ ले सकते हैं:

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

ASP.NET MVC परियोजना मैं लक्ष्य .NET 4.6.1 पर काम कर रहा हूँ। यह विजुअल स्टूडियो 2019 के साथ IIS Express में डिबगिंग करते समय मेरी मशीन पर पूरी तरह से काम करता है।

समस्या तब हुई जब एज़्योर को तैनात किए गए एप्लिकेशन को चलाने का प्रयास किया गया। मुझे यह त्रुटि मिल रही थी:

फ़ाइल या असेंबली को लोड नहीं किया जा सका 'System.Net.Http, संस्करण = 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> वास्तव में <HintPath> से ..\packages फ़ोल्डर की ओर इशारा करता है, अर्थात, यह वास्तविक संस्करण है जिसे स्थापित किया गया है। एक बार इस विशिष्ट संस्करण को तैनात करने के बाद सर्वर की तरफ भी बहाल हो जाएगा और सब कुछ एक बाइंड रीडायरेक्ट के साथ काम करना चाहिए।

... और इसलिए बाध्यकारी पुनर्निर्देशन को इस तरह से 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 वेब साइट आखिरकार बिना किसी त्रुटि के शुरू हुई।


मेरे लिए वास्तव में कुछ अजीब था। क्या समस्या थी यह जानने के बाद घंटों डिबगिंग की आवश्यकता थी। यह स्थानीय रूप से नहीं हुआ, लेकिन केवल परियोजना के निर्माण के लिए जेनकींस का उपयोग करते समय।

मेरे पास एक छोटी सी लाइब्रेरी थी जिसका उपयोग डॉटनेट सीबीआर 2.0 और मुख्य परियोजना डब्ल्यूसीएफ परियोजना थी जो सामान्य .NET पर आधारित है (मेरा विशेष रूप से v4.6.1 था)। लेकिन डॉटनेट फ्रेड लाइब्रेरी के स्टार्टअप क्लास में मेरा कुछ कोड था जो इस तरह दिखता था:

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

यह इंटरफ़ेस डॉटनेट फ्रेड लाइब्रेरी के अंदर रहता है, जबकि कार्यान्वयन इसके बाहर है (इसके 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 प्रोजेक्ट से एक डॉटनेट सीबीआर लाइब्रेरी में पारित कर रहा हूं जो कि कुछ पागल कारण के लिए डॉटनेट सीएक्स को पसंद नहीं करता है और शायद यह सोचता है कि HttpClient विभिन्न वर्गों से आ रहा है, परिणामस्वरूप System.Net.Http 4.xxx फेंक रहा है System.Net.Http 4.xxx को अपवाद नहीं मिला। जब एक सामान्य .NET प्रोजेक्ट से एक HttpClient को स्वीकार नहीं करने के लिए कोड हटा दिया जाता है, लेकिन लाइब्रेरी के अंदर एक नया func पैदा कर रहा है जो अपने खुश और ठीक काम कर रहा है। आशा है कि यह किसी और की मदद कर सकता है क्योंकि यह त्रुटि कई कारणों से हो रही है :)


मुझे इस त्रुटि का सामना करना पड़ा जब मैंने अपने एक सर्वर में एक वेब सेवा को तैनात किया। परियोजना ने .Net फ्रेमवर्क 4.7.2 को लक्षित किया, जो सर्वर पर स्थापित नहीं था। सर्वर पर 4.7.2 फ्रेमवर्क को स्थापित करने से समस्या ठीक हो गई।


पहले अपने स्थानीय फाइल सिस्टम से हटाएं:

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

फिर परियोजनाओं में सभी संदर्भों को हटा दें और, 4.0 संदर्भ जोड़ें।
इससे मेरी समस्या हल हो गई।


एक सरल समाधान मैंने पाया कि वेब परियोजना के लिए लक्ष्य ढांचे को 4.6 पर डाउनग्रेड करना।

मैं क्लाइंट और वेब एप्लिकेशन बनाता हूं, क्लाइंट के पास .net फ्रेमवर्क 4.7.1 और वेब एक ही है और मैं एक ही मुद्दे का सामना कर रहा हूं, जब डाउनग्रेड लक्ष्य। वेब के लिए नेट फ्रेमवर्क यह मेरे लिए काम करता है।


मैंने इस मुद्दे को ठीक करने के लिए web.config से सभी बाइंडिंग को हटा दिया था और ए

Update-Package -reinstall

इसने पुराने बाइंडिंग के एक समूह को हटा दिया जो शायद वहां होने की आवश्यकता नहीं है और वास्तव में एक अच्छी सफाई की।