2013-04-12 7 views
20

हमारा आवेदन दो प्रक्रियाओं के बीच संवाद करने के लिए नामित पाइपों पर डब्ल्यूसीएफ का उपयोग करता है (नोट: न तो प्रक्रिया एक विंडोज सेवा है।) हमारा आवेदन दो साल से बिना किसी घटना के मैदान में चल रहा है।तृतीय पक्ष ऐप हमारे डब्ल्यूसीएफ आवेदन को तोड़ता है

अब हम रिपोर्ट प्राप्त कर रहे हैं कि किसी तृतीय पक्ष एप्लिकेशन (विशेष रूप से, गार्मिन एक्सप्रेस) की उपस्थिति हमारी तोड़ रही है। मैंने घर में गार्मिन एक्सप्रेस स्थापित किया है और व्यवहार की पुष्टि की है। विशेष रूप से "गार्मिन कोर अपडेट सर्विस" चलते समय, हमारे एप्लिकेशन को असफल होने का कारण बनता है।

जब गार्मिन सेवा चल रही है, तो हमारे आवेदन की "सेवा" पक्ष शुरू होती है और डब्ल्यूसीएफ एंडपॉइंट बनाने में कोई समस्या नहीं होती है। लेकिन जब ग्राहक शुरू होता है और सेवा से कनेक्ट करने का प्रयास करता है, तो यह EndpointNotFoundException के साथ विफल रहता है, जैसे कि सेवा भी नहीं चल रही है।

इस बिंदु पर, मैं सचमुच सेवा नियंत्रण कक्ष से गार्मिन सेवा को रोक सकता हूं, फिर क्लाइंट को अपनी सेवा को पुनरारंभ किए बिना सफलतापूर्वक फिर से चला सकता हूं। अगर मैं फिर से गार्मिन सेवा शुरू करता हूं, तो क्लाइंट शुरू करने के लिए और प्रयास विफल हो जाते हैं। तो यह कम से कम साबित करता है कि हमारी डब्ल्यूसीएफ सेवा पूरी हो रही है और पूरे समय चल रही है, और गार्मिन सॉफ्टवेयर किसी भी तरह से हमारे क्लाइंट की कनेक्ट करने की क्षमता को अवरुद्ध कर रहा है।

हम एंडपॉइंट पते के लिए अपना नाम उपयोग कर रहे हैं (उदाहरण के लिए "net.pipe: // localhost/MyPrivateAplication" जैसे कुछ)। मैंने इस पते को कई अन्य नामों में बदलने की कोशिश की है, लेकिन इस मुद्दे पर इसका कोई प्रभाव नहीं पड़ता है।

डब्ल्यूसीएफ का उपयोग करने के लिए हमारे अपने आवेदन की क्षमता को तोड़कर, एक और आवेदन कैसे चला सकता है?

अद्यतन: अनुरोध करके, यहां सेवा पक्ष से एक कोड स्निपेट है। मैंने इस मुद्दे को अलग करने के प्रयास में इसे हमारे मूल कोड से सरल बना दिया है। अब तक, मेरे द्वारा किए गए एक भी बदलाव से इस मुद्दे पर कोई असर नहीं पड़ा है। अपने प्रश्न का

MyService service = new MyService(); 
ServiceHost host = new ServiceHost(service); 
string hostAddress = new Uri("net.pipe://localhost/MyWCFConnection"); 
host.AddServiceEndpoint(typeof(IMyService), new NetNamedPipeBinding(), hostAddress); 
host.Open(); 
+0

आपकी सेवा कैसे अपना सेवा यूआरएल निर्दिष्ट करती है? क्या यह आधार + सापेक्ष पता या एक बहिष्कार पता है? हो सकता है कि आप कोड/कॉन्फ़िगरेशन से निष्कर्ष पोस्ट कर सकें कि आपकी सेवा समाप्ति बिंदु कैसे स्थापित की गई है। –

+0

मैंने अपनी पोस्ट को कोड स्निपेट के साथ अपडेट किया है। मुझे पूरा यकीन है कि यह एक पूर्ण पता है, सही? दोबारा, यह सेवा-साइड कोड सफलतापूर्वक निष्पादित करता है कि गार्मिन सेवा चल रही है या नहीं। केवल ग्राहक पक्ष प्रभावित है। – ObjetDart

+0

हां, यह एक पूर्ण पता है, इसलिए मेरे पहले सुझाव से कुछ और सूक्ष्म चल रहा है। –

उत्तर

12

एक संभावित जवाब "कैसे किसी अन्य अनुप्रयोग, बस चलाकर, हमारे अपने आवेदन तोड़ सकते हैं ...":

  1. अन्य आवेदन भी WCF NetNamedPipeBinding उपयोग करता है।
  2. दोनों अनुप्रयोग बेस + सापेक्ष यूआरएल का उपयोग कर सेवा अंतराल बनाते हैं।
  3. एप्लिकेशन पते की मूल पता, और HostNameComparisonMode ऐसा है कि one of the URL variants used by the client-side WCF stack to locate the metadata for the service पर अनुप्रयोगों के बीच एक नाम टक्कर है।

मुझे नहीं पता कि गार्मिन सेवा वास्तव में डब्ल्यूसीएफ नेट नामांकित पाइप बाइंडिंग का उपयोग करती है, लेकिन यह एक संभावना है कि आपको जांच करनी चाहिए। using absolute URLs for NetNamedPipe endpoints द्वारा समस्या से बचा जा सकता है।


ठीक है, तो सवाल के अपडेट के बाद, अब हम जानते हैं कि गार्मिन सेवा WCF NetNamedPipeBinding उपयोग कर रहा है, और हम जानते हैं कि आपके आवेदन अपनी सेवा, एक पूर्ण पते का उपयोग कर तो ऊपर स्पष्टीकरण नहीं है पंजीकृत करता है पूरी कहानी

  1. मान लीजिए गार्मिन सेवा एक प्रक्रिया है जो सुरक्षा विशेषाधिकार SeCreateGlobalPrivilege (Windows सेवा जब तक विशेष रूप से विशेषाधिकार निष्क्रिय करने के लिए कोडित होगा जो) है में चलता है:

    यहाँ एक और परिकल्पना है।

  2. मान लीजिए कि यह net.pipe: // localhost और सापेक्ष एंडपॉइंट पते के मूल पते के साथ अपने डब्ल्यूसीएफ नामित पाइप एंडपॉइंट को भी पंजीकृत करता है।
  3. अब इसकी सेवा मेटाडेटा को साझा नाम मैपिंग ऑब्जेक्ट का उपयोग ग्लोबल नेमस्पेस में एक नाम के साथ प्रकाशित किया जाएगा।
  4. आपकी सेवा एप्लिकेशन विंडोज सेवा नहीं है। मेरी परिकल्पना यह है कि इसकी प्रक्रिया में सुरक्षा विशेषाधिकार SeCreateGlobalPrivilege नहीं है। यदि ऐसा है, तो इसकी सेवा मेटाडेटा साझा लोकेशन मैपिंग ऑब्जेक्ट का उपयोग केवल स्थानीय सत्र नामस्थान में ही प्रकाशित की जाएगी।
  5. अब आपकी क्लाइंट प्रक्रिया गर्मिन सेवा चलने पर कनेक्शन शुरू करने का प्रयास करती है ... डब्ल्यूसीएफ क्लाइंट-साइड चैनल स्टैक नेट नामांकित पाइप बाइंडिंग तत्व आपकी सेवा यूआरएल net.pipe: // के आधार पर आपकी सेवा के लिए सेवा मेटाडेटा का पता लगाने का प्रयास करता है। स्थानीय होस्ट/MyWCFConnection। जैसा ऊपर दिए गए लिंक में बताया गया है, यह मेटाडेटा युक्त साझा मेमोरी ऑब्जेक्ट के लिए नाम प्राप्त करने के लिए सेवा URL के विभिन्न रूपों का उपयोग करके खोज निष्पादित करेगा। यह स्थानीय नामस्थान में देखने से पहले, बदले में भिन्नताओं की पूरी सूची के लिए, पहले वैश्विक नामस्थान में दिखता है।
  6. इस मामले में, पहला प्रयास "net.pipe: // +/MyWCFConnection" से प्राप्त नाम के लिए होगा, और संभवतः यह वैश्विक नामस्थान में इस नाम के साथ एक वस्तु को खोजने में विफल रहता है।
  7. हालांकि, दूसरा प्रयास वैरिएंट "net.pipe: // + /" पर आधारित होगा, और यह ग्लोबल नेमस्पेस में प्रकाशित गार्मिन सेवा की साझा मेमोरी मैपिंग के नाम से मेल खाएगा। खोज आदेश के कारण, यह स्थानीय सत्र नामस्थान में प्रकाशित आपकी सेवा के मेटाडेटा को कभी नहीं मिलेगा।
  8. आपका ग्राहक गार्मिन सेवा की पाइप से कनेक्ट करने का प्रयास करता है। आइए मान लें कि गार्मिन सेवा में कुछ सुरक्षा लागू की गई है जिसके परिणामस्वरूप आपके क्लाइंट को एक्सेस एक्सेस के साथ अपमानित किया जा रहा है (उदाहरण के लिए यह set an ACL on its pipe हो सकता है)। परिणाम एक एंडपॉइंट नॉटफाउंड अपवाद के रूप में अच्छी तरह से सतह हो सकता है। [लेटर संपादित करें: दरअसल, संभवत: क्या हो रहा है यह है कि आपका क्लाइंट वास्तव में गार्मिन सेवा से जुड़ रहा है, फ़्रेमिंग प्रोटोकॉल के प्रीम्बल हैंडशेक को शुरू कर रहा है, और फ़्रेमिंग प्रोटोकॉल गलती (http://schemas.microsoft.com/ws/2006/05/framing/faults/EndpointNotFound) प्राप्त कर रहा है क्योंकि यूआरएल ने रिकॉर्ड रिकॉर्ड में अनुरोध किया है गर्मिन सेवा की अपेक्षा करने वाले मैच से मेल नहीं खाएगा। बाध्यकारी तब कनेक्शन को छोड़ रहा है और इस गलती को आपके क्लाइंट कोड को एंडपॉइंट नॉटफाउंड अपवाद के रूप में सामने रख रहा है।]

इसके बारे में आप क्या कर सकते हैं? मेरा सुझाव है:

  • ऊपर परिकल्पना या कुछ इसी तरह पुष्टि की जा सकती हैं, और Garmin आधार + सापेक्ष सिर्फ net.pipe का एक आधार के साथ संबोधित कर प्रयोग कर रहे हैं: // स्थानीय होस्ट, सबसे अच्छा उन पर स्वामित्व को पाने के लिए होगा समस्या: वे अपने आधार पते को अद्वितीय रूप से अद्वितीय होने की संभावना में बदलकर ऐसी समस्या को बहुत आसानी से ठीक कर सकते हैं।
  • आप अपने सेवा एप्लिकेशन के लिए सुरक्षा विशेषाधिकार SeCreateGlobalPrivilege के साथ चलाने के लिए कुछ रास्ता ढूंढकर शायद इसके आसपास काम कर सकते हैं: यह विंडोज सेवा बनाने या प्रशासक के रूप में चलने के बिना आसान नहीं है, लेकिन शायद असंभव नहीं है। फिर आपका मेटाडाटा ग्लोबल नेमस्पेस में भी प्रकाशित किया जाएगा और क्लाइंट की खोज गार्मिन के समक्ष इसे पाई जाएगी।
  • [बाद में संपादित करें] शायद एक वर्कअराउंड है जिसमें मेजबाननाम कॉम्परिसनोड की सटीक बाध्यकारी की संपत्ति शामिल है, और सर्विसहोस्ट के मेजबान भाग के रूप में लोकहोस्ट के समानार्थी का उपयोग करना (जैसे net.pipe: //127.0.0.1/MyWCFConnection)। यह गार्मिन वेरिएंट के आस-पास की खोज को चला सकता है ताकि आपके क्लाइंट को स्थानीय सत्र नामस्थान में नामों पर विचार करने का मौका मिले। मुझे नहीं पता कि यह काम करेगा, लेकिन कोशिश करने लायक है, मैंने सोचा होगा।
  • और एक बहुत लंबा शॉट: क्या आपकी कंपनी के पास माइक्रोसॉफ्ट के साथ उत्पाद समर्थन संबंध है?तर्कसंगत रूप से यह डब्ल्यूसीएफ में एक गंभीर डिजाइन दोष है: यदि आप इसके बारे में कोई झगड़ा करते हैं तो संभवतः आप माइक्रोसॉफ्ट को इसके लिए एक क्यूएफई पैच जारी कर सकते हैं उदा। क्लाइंट-साइड स्टैक को केवल स्थानीय नेमस्पेस को आज़माने के लिए बाध्यकारी संपत्ति प्रदान करने के लिए।
+0

मुझे यकीन है कि गार्मिन सेवा [इस आलेख] में जानकारी के आधार पर डब्ल्यूसीएफ नेटनामयुक्त पाइप बाइंडिंग का भी उपयोग कर रही है (http://blogs.msdn.com/b/rodneyviana/archive/2011/03/22/named-pipes -इन-WCF-कर रहे हैं-नाम-लेकिन-नहीं-दर-आप और कैसे से खोजे जाने-वास्तविक-windows-वस्तु name.aspx)। जब गार्मिन सेवा शुरू की जाती है, तो एक नया नामित पाइप उसी GUID-style नाम के साथ प्रकट होता है जब आप अन्य डब्ल्यूसीएफ सेवाओं के साथ मिलता है जो नामित पाइप का उपयोग करते हैं। – ObjetDart

+0

मैंने पुष्टि की है कि यदि मैं सेवा पक्ष प्रक्रिया को प्रशासक के रूप में चलाता हूं तो समस्या दूर हो जाती है। यह निश्चित रूप से आपके दूसरे सिद्धांत के लिए समर्थन देता है। यह हमें क्षेत्र में समस्या को हल करने में मदद नहीं करेगा, लेकिन कम से कम हमारे पास अब एक संभावित स्पष्टीकरण है। – ObjetDart

+0

तो, ऐसा लगता है जैसे हम अटक गए हैं। हमें इस मुद्दे को अब मैदान में ठीक करने की जरूरत है, हम गार्मिन के लिए शायद अपने उत्पाद रिलीज चक्र के अवकाश पर इसे ठीक नहीं कर सकते हैं, जो महीनों या साल भी हो सकते हैं। हमारे उत्पाद का सेवा-पक्ष प्रक्रिया भाग अंतिम उपयोगकर्ता के खाते के तहत चलता है, इसलिए AFAIK को SeCreateGlobalPrivilege के साथ चलाने का कोई तरीका नहीं है। – ObjetDart

6

हम माइक्रोसॉफ्ट में इस मुद्दे को शून्य कर चुके हैं जिस तरह से गार्मिन कोर अपडेट सर्विस नामित पाइप बनाती है। नामांकित पाइप विभिन्न क्षेत्रों में बनाया जा सकता है - वैश्विक और स्थानीय। वैश्विक दायरा अनिवार्य रूप से मशीन चौड़ा है और स्थानीय उपयोगकर्ता के लिए विशिष्ट है। गार्मिन का आवेदन

ए है। सिस्टम सेवा के रूप में चल रहा है, इसलिए नामित पाइप सेवा सुनने के दायरे वैश्विक हैं।

बी। "net.pipe: // localhost /" (जैसे किसी उप-पथ/सेगमेंट के) के रूट पते पर सुनना।

सी। एक StrongWildcard होस्ट नाम तुलना मोड का उपयोग करना।

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

ई। इसका मतलब यह भी है कि गार्मिन उन सभी श्रोताओं को पूरी तरह से अवरुद्ध कर रहा है जो स्थानीय स्कोप का उपयोग कर रहे हैं

इसके लिए आदर्श फिक्स गर्मिन एप्लिकेशन में बदलाव होगा जैसे कि यह अपने नेटपाइप श्रोता को अधिक विशिष्ट यूआरएल के साथ पंजीकृत करता है।

+2

मुझे लगता है कि माइक्रोसॉफ्ट को इसे ठीक करने या इसे ठीक करने की योजना बनाना चाहिए। हमने अभी पाया है कि सेवा "एचपी सपोर्ट सॉल्यूशंस फ्रेमवर्क सर्विस" भी इस मुद्दे का कारण बन रही है। – Pep

4

मुझे यह दिखाने के लिए एक विधि मिली है कि कौन से अनुप्रयोग net.pipe का उपयोग करते हैं (हालांकि जरूरी नहीं कि यह गलत तरीके से उपयोग कर रहे हों)।

पहले डाउनलोड sysinternals से हैंडल आवेदन:

https://technet.microsoft.com/en-us/sysinternals/handle.aspx?f=255&MSPPError=-2147217396

फिर व्यवस्थापक के रूप में एक कमांड प्रॉम्प्ट खोलें, और "Handle.exe net.pipe" (ऋण उद्धरण) चलाते हैं। यह net.pipe का उपयोग कर सभी अनुप्रयोगों को सूचीबद्ध करेगा जो वर्तमान में चल रहे हैं। वहां से, आप एक समय में एक को मार या अक्षम कर सकते हैं, जब तक कि आपके अपराधी की खोज न हो जाए। मैं इसका उपयोग कभी भी 4-5 से अधिक प्रक्रियाओं का उपयोग नहीं करता हूं। यदि आप व्यवस्थापक के रूप में कमांड प्रॉम्प्ट चलाने में विफल रहते हैं, तो यह 0 परिणाम दे सकता है।

नीचे सभी आवेदनों मैंने पाया कि net.pipe के साथ हस्तक्षेप कर रहे हैं:

  • "हिमाचल प्रदेश समर्थन समाधान की रूपरेखा सेवा" - केवल कुछ संस्करणों
  • "गार्मिन कोर अद्यतन सेवा" प्रभावित - नए संस्करण में लेकिन बॉक्स से बाहर तय तोड़ दिया है
  • "WBE सेवा" - एक वायरलेस डॉकिंग स्टेट के साथ संयोजन के रूप में एक जोड़े को Dell लैपटॉप द्वारा प्रयोग किया जाता आयन
  • "इंटेल (आर) सुरक्षा सहायता" सेवा - मैं Win10 के एक जोड़े पर देखा जल्दी 2016
  • "Baraccuda डब्ल्यूएसए सेवा" लैपटॉप - वेब सुरक्षा एजेंट। यदि आपने इसे अक्षम कर दिया है तो शायद ग्राहक को परेशान कर देगा।
  • "DropboxOEM.exe" - स्टोर-खरीदे गए पीसी में शामिल करने के लिए ड्रॉपबॉक्स का एक संस्करण। अभी तक Win10 पर ध्यान दिया गया है।यह अद्वितीय है, क्योंकि यह पहला है कि मैंने पाया है कि विंडोज़ सेवा नहीं है, जो मैं बता सकता हूं।
  • "एमटीसी सेवा" - कुछ गेटैक ब्रांड पीसी पर स्थापित। यह सुनिश्चित करें कि यह क्या करता है।
  • "pcdrcui.exe" - कोई सेवा नहीं है, लेकिन व्यवस्थापक के रूप में चलता है। डेल के समर्थन सहायक का घटक।

मैं ऐसे अनुप्रयोग का समर्थन करता हूं जिसके लिए net.pipe की आवश्यकता है, इसलिए मैं इस सूची को अपडेट करूंगा क्योंकि मुझे यह और सेवाएं मिलती हैं जो मुझे करती हैं।

+0

इस बहुत उपयोगी उत्तर के लिए बहुत बहुत धन्यवाद, हमें बहुत सी सिरदर्द बचाया! हमारे पास ओपी के समान सटीक स्थिति थी और आपके निर्देशों का पालन करके अपराधी की पहचान करने में सक्षम थे; हमारे मामले में यह ** "वंडरवेयर इन टच आईडीटा सेवा" ** ('SE.Scada.Asb.InTouchDataService.exe') था जो वंडरवेयर इन टच एचएमआई सिस्टम के साथ आता है (मुझे नहीं पता कि यह वास्तव में क्या करता है)। इस प्रक्रिया को मारने से अचानक हमारे डब्ल्यूसीएफ-आधारित एप्लिकेशन को फिर से कार्यान्वित किया गया। – Golvellius

संबंधित मुद्दे