2009-12-04 17 views
7

का उपयोग करते समय नामित पाइप नहीं मिला मैं डब्ल्यूसीएफ सेवा का डेवलपर हूं। मेरे टेस्ट क्लाइंट इसके साथ बहुत अच्छी तरह से काम करते हैं। लेकिन जब वास्तविक ग्राहकों की बात आती है (उसी क्लाइंट प्रॉक्सी का उपयोग करके), यह विफल हो जाता है। एक ही WCF सेवा netTcpBinding साथ काम करता है, यह त्रुटि केवल netNamedPipeBinding के साथ होता है, यहां तक ​​कि साथ ConcurrencyMode = ConcurrencyMode.SingleWCF netNamedPipeBinding

यहाँ अपवाद

कोई endpoint net.pipe पर सुन रहा था है: // स्थानीय होस्ट/MyService जो संदेश स्वीकार कर सकता है। यह अक्सर गलत पता या SOAP क्रिया के कारण होता है। अधिक जानकारी के लिए, उपस्थित होने पर, इनरएक्सप्शन देखें।

सर्वर स्टैक ट्रेस: ​​पर

System.ServiceModel.Channels.PipeConnectionInitiator.GetPipeName (उरी uri) System.ServiceModel.Channels.NamedPipeConnectionPoolRegistry.NamedPipeConnectionPool.GetPoolKey पर (EndpointAddress पता, उरी के माध्यम से) सिस्टम.ServiceModel.Channels.CommunicationPool`2.TakeConnection (EndpointAddress पता, उरी के माध्यम से, टाइमस्पेन टाइमआउट, टीके & कुंजी) सिस्टम पर। सेवा मॉडल .Channels.ConnectionPoolHelper.EstablishConnection System.ServiceModel.Channels पर (TimeSpan का समय समाप्त) System.ServiceModel.Channels.ClientFramingDuplexSessionChannel.OnOpen (TimeSpan का समय समाप्त) System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan का समय समाप्त) पर पर .ServiceChannel.OnOpen (TimeSpan का समय समाप्त) System.ServiceModel.Channels.CommunicationObject.Open (TimeSpan का समय समाप्त) पर System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce (TimeSpan टाइमआउट, CallOnceManager झरना)
पर पर System.ServiceModel.Channels.ServiceChannel.EnsureOpene घ (TimeSpan का समय समाप्त) System.ServiceModel.Channels.ServiceChannel.Call पर System.ServiceModel पर (स्ट्रिंग कार्रवाई, बूलियन oneway, ProxyOperationRuntime आपरेशन, वस्तु [] इन, वस्तु [] बहिष्कार, TimeSpan का समय समाप्त)। Channels.ServiceChannelProxy.InvokeService (IMethodCallMessage methodCall, ProxyOperationRuntime आपरेशन) System.ServiceModel.Channels.ServiceChannelProxy.Invoke (iMessage संदेश) पर

अपवाद rethrown पर [0]: System.Runtime.Remoting.Proxies पर .RealProxy.HandleReturnMessage (IMSEAGE reqMsg, iMessage retMsg) System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (MessageData & पर msgData,

इनर अपवाद पर Int32 प्रकार)

PipeException: "पाइप अंत बिंदु ' net.pipe: // localhost/MyService 'आपकी स्थानीय मशीन पर नहीं मिल सका।"

+1

बस स्पष्ट होना - आपका ग्राहक और आपकी सेवा एक ही मशीन पर हैं? यदि नामित पाइप काम नहीं करेंगे ... – Murph

+0

@Murph, हाँ वे एक ही मशीन पर हैं। –

+0

क्या आपने इसे हल करने का प्रबंधन किया था? मुझे एक ही समस्या है। – Tsury

उत्तर

18

स्टैक ट्रेस से पता चलता है कि सेवा के URL से प्राप्त करने का प्रयास करते समय क्लाइंट-साइड डब्ल्यूसीएफ चैनल स्टैक विफल रहा सेवा द्वारा उपयोग किया जा रहा पाइप। सेवा a named shared memory section में एक छोटी संरचना रखकर पाइप नाम (जो एक GUID है जो सेवा पुनरारंभ होता है) प्रकाशित करती है जिसमें GUID को इसके फ़ील्ड में से एक के रूप में शामिल किया जाता है। साझा स्मृति अनुभाग के लिए उपयोग किया गया नाम एल्गोरिदम लागू करके सेवा यूआरएल से लिया गया है जो NetNamedPipeBinding के लिए सर्वर-साइड और क्लाइंट-साइड डब्ल्यूसीएफ कोड दोनों में संकलित है।

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

विस्टा से पहले विंडोज प्लेटफार्मों पर यह काफी संभावना नहीं है कि डब्ल्यूसीएफ क्लाइंट में कभी भी साझा मेमोरी खोलने के लिए सुरक्षा अनुमतियों की कमी नहीं होगी, पाइप नाम GUID को पढ़ें, और फिर सफलतापूर्वक सेवा की पाइप से कनेक्ट करें। लेकिन विस्टा और बाद के प्लेटफॉर्म पर नई सुरक्षा तंत्र हैं जो इसे अधिक आम विफलता परिदृश्य बनाते हैं।

विस्टा ने नामांकित कर्नेल ऑब्जेक्ट्स के लिए अलग-अलग नामस्थानों की एक अवधारणा पेश की: एक वैश्विक (मशीन-व्यापी) नामस्थान है, और प्रत्येक लॉगऑन सत्र के लिए एक निजी नामस्थान है। पाइप नाम का विज्ञापन करने वाले साझा स्मृति अनुभाग की तलाश करते समय NetNamedPipeBinding क्लाइंट कोड दोनों नामस्थानों को आजमाएगा। यदि सर्वर ने वैश्विक नाम का उपयोग करके साझा मेमोरी बनाई है, या यदि सेवा और क्लाइंट एक ही लॉगऑन सत्र में चल रहे हैं, तो क्लाइंट जो खोज रहा है वह उसे मिलेगा। यदि, हालांकि, सेवा वैश्विक नामस्थान में कोई ऑब्जेक्ट नहीं बना सकती है (यह हमेशा पहले ऐसा करने का प्रयास करती है) तो यह इसे निजी सत्र नामस्थान बनाने के लिए वापस आ जाएगी, और उसके बाद केवल उसी सत्र में चल रहे क्लाइंट देख पाएंगे यह। ग्लोबल नेमस्पेस कर्नेल ऑब्जेक्ट्स को बनाने के लिए Vista और बाद के प्लेटफार्मों में एक विशेष विशेषाधिकार की आवश्यकता होती है, जो आमतौर पर केवल विंडोज सेवा प्रक्रियाओं और "प्रशासक के रूप में चल रहे अनुप्रयोगों" के अनुप्रयोगों की आवश्यकता होती है। इंटरैक्टिव उपयोगकर्ता सत्र में चल रहे किसी एप्लिकेशन में होस्ट की गई WCF NetNamedPipe सेवा से कनेक्ट करने का प्रयास करने वाले Windows सेवा में क्लाइंट बनाने का प्रयास करना एक आम गड़बड़ है।

विस्टा अनिवार्य इंटीग्रटी मैकेनिज्म एक डब्ल्यूसीएफ नेट नामांकित पाइप बाइंडिंग सेवा से कनेक्ट करने वाले एक क्लाइंटिव क्लाइंट को भी रोक सकता है, यदि क्लाइंट कोड सेवा होस्ट करने वाले कोड से कम अखंडता संदर्भ (जैसे ब्राउज़र प्लग-इन) में चल रहा है।

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

+0

यह मेरी वास्तविक समस्या का सही जवाब था। रिकॉर्ड के लिए, मुझे इसे काम करने के लिए प्रशासनिक अनुमति के साथ विजुअल स्टूडियो शुरू करना पड़ा। साथ ही, कमांड प्रॉम्प्ट से क्लाइंट और सर्वर दोनों को शुरू करना एक समाधान था। विस्तृत उत्तर के लिए बहुत बहुत धन्यवाद! – BeardinaSuit

+1

हां, लेकिन अगर मैं इसे व्यवस्थापक के रूप में चलाने के लिए नहीं चाहता हूं तो क्या होगा? मेरी प्रक्रिया एक ही सत्र पर हैं। – Tsury

3

अपने ग्राहक द्वारा इस्तेमाल किया endpoint कि समाप्ति बिंदु अपने WCF सेवा द्वारा उजागर मेल खाना चाहिए। इसका मतलब है कि पता/बाध्यकारी/अनुबंध निर्दिष्ट ग्राहक endpoint की टपल चाहिए बिल्कुल मैच पता/बाध्यकारी/अनुबंध अपनी डब्ल्यूसीएफ सेवा द्वारा उजागर किए गए एक एंडपॉइंट का टुपल। यदि आप ऐप.कॉन्फिग दृष्टिकोण का उपयोग कर रहे हैं, तो सुनिश्चित करें कि डब्ल्यूसीएफ सेवा और क्लाइंट कॉन्फ़िगरेशन दोनों फाइलों में सबकुछ सही ढंग से लिखा गया है। यदि आप एंडपॉइंट्स प्रोग्रामेटिक रूप से जोड़ रहे हैं, तो सुनिश्चित करें कि आप ' कोड में कुछ भी गलत वर्तनी नहीं है।

+0

इसे पोस्ट करने के लिए धन्यवाद, लेकिन यह मेरा मामला नहीं था। –

+0

क्या इस मामले में लॉगिन महत्वपूर्ण है? यदि किसी उपयोगकर्ता द्वारा स्वामित्व वाली प्रक्रिया किसी अन्य उपयोगकर्ता द्वारा बनाई गई नामित पाइप तक पहुंच सकती है? –

+0

मुझे यकीन नहीं है। मैं अपने स्थानीय लॉगिन क्लाइंट से संवाद के लिए नामित पाइप का उपयोग करता हूं, बिना किसी समस्या के एक ही मशीन पर विंडोज सिस्टम सेवा। –

4

इस त्रुटि को हल करने और इस पोस्ट में आने पर इस रूट समस्या को ठीक करने की एक और संभावना - यदि आपको कोई त्रुटि मिल रही है कि net.pipe पता आपके यूआरएल में पाया जा सकता है (यानी।http://localhost:1234/MyService/etc/) सुनिश्चित करें कि कि नेट.पिप श्रोता एडाप्टर विंडोज सेवा शुरू हुई। (मैंने नेट टीसीपी श्रोता एडाप्टर भी शुरू किया)

सेवा कुछ परिदृश्यों में सक्षम या शुरू नहीं होती है, खासकर जब एक रिमोट सर्वर पर तैनाती हो सकती है, जिसमें सक्रिय रूप से उपयोग किए जाने वाले बहुत सारे विकास उपकरण स्थापित नहीं होते हैं ये सेवाएं सेवा शुरू करने से इस मुद्दे को ठीक किया गया।

+0

यह वही है जो मेरी समस्या थी ... मेरी साइट ठीक से काम कर रही थी, फिर अचानक बंद हो गई। सेवा शुरू की और सबकुछ ठीक बाद में चला गया। – Arnaud

+0

हेललुजाह! भविष्य के पाठकों के लिए ::: इस विंडोज़ सेवा को स्थापित करने के लिए, मेरा मानना ​​है कि पथ ::: "विंडोज़ सुविधाओं को चालू या बंद करें" /// ".NET Framework 4.6 उन्नत सेवाएं" /// "डब्ल्यूसीएफ सेवाएं" /// "नामित पाइप सक्रियण" (यदि यह सेवा आपकी विंडोज़ सेवाओं की सूची में प्रकट नहीं होती है, तो आपको इसे इंस्टॉल करना होगा)। धन्यवाद! – granadaCoder