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




visual-studio-2017 dotnet-httpclient (8)

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

मेरे पास एक साधारण क्लास लाइब्रेरी प्रोजेक्ट (पूर्ण .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


आपके द्वारा सामना की जा रही समस्या विज़ुअल स्टूडियो से संबंधित है, विशेष रूप से 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


उत्तर @AndreiU पहले से ही दिया गया था और स्थानीय स्तर पर रनटाइम त्रुटियों को कैसे पुन: पेश किया जाए।

Azure परिनियोजित करते समय मुझे रनटाइम त्रुटि मिली, स्थानीय रूप से नहीं।

{"संदेश": "एक त्रुटि हुई है।", "अपवाद अपवाद": "एक त्रुटि तब हुई जब प्रकार 'नियंत्रककंट्रोलर' का एक नियंत्रक बनाने की कोशिश कर रहा है। सुनिश्चित करें कि नियंत्रक में एक पैरामीटर रहित सार्वजनिक निर्माण है।", "ExceptionType": "System.InvalidOperationException", "StackTrace": "System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (HttpRequestessessage अनुरोध), HttpControllerDescriptor नियंत्रकDescriptor, टाइप कंट्रोलर \ _ \ _ \ _ \ n \ n \ n \ n \ n \ n \ _ \ _ \ _ \ _ \ _ \ _ \ n \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ HttpRequestMessage का अनुरोध) System.Web.Http.Dispatcher.HttpControllerDispatcher.d__1.MoveNext () "," इनरसेप्शन ": {" संदेश: "" एक त्रुटि हुई है। "," ExceptionMessage ":" "लोड नहीं कर सका। फ़ाइल या असेंबली 'System.Net.Http, संस्करण = 4.2.0.0, संस्कृति = तटस्थ, 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 / .roject.BackOffice.Web \ Controllers \ आदेश \ OrderController.cs: पंक्ति 30 \ r \ n पर lambda_method (क्लोजर) \ r \ n पर System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create (HttpRequestMessage अनुरोध, HttpControllerDescriptor नियंत्रक नियंत्रक)

जब मैंने विधानसभाओं को देखना शुरू किया तो मैं देख सकता था कि मेरी वेब परियोजना और सेवा परियोजना ने System.Net.Http लिए विभिन्न संस्करणों को लक्षित किया है।

वेब परियोजना:

सेवा परियोजना:

यह सोचना आसान है कि यह संस्करणों में एक बेमेल के कारण होता है, लेकिन यहां कुंजी त्रुटि को देखने के लिए है The system cannot find the file specified.

पथ प्रॉपर्टी को देखते हुए हम देख सकते हैं कि वेब प्रोजेक्ट एक .Net फ्रेमवर्क असेंबली को लक्षित करता है, जबकि सेवा विज़ुअल स्टूडियो 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 सेट करने में जितना आसान है, समस्या को ठीक कर सकते हैं, हालांकि सभी मामलों में नहीं।

अपने स्थानीय मशीन पर त्रुटि को पुन: उत्पन्न करने के लिए, केवल 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>
  <Private>True</Private>
</Reference>

यदि आप Jenkins, TeamCity या AppVeyor जैसे बिल्ड सर्वर का उपयोग करते हैं तो रनटाइम गुम हो जाता है। वहाँ भी मौजूद हो सकता है। इस मामले में यह System.Net.tt के NuGet संस्करण का उपयोग करने में मदद नहीं कर सकता है .dll स्थानीय रूप से लापता .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>

इस मुद्दे के बारे में एक अच्छा गितुब सूत्र:

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


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

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

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


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


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


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

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

मैंने अभी-अभी 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 वेब साइट आखिरकार बिना किसी त्रुटि के शुरू हुई।


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

Update-Package -reinstall

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