2012-04-28 22 views
6

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

  • net.pipe: // स्थानीय होस्ट/superuniquepipe1
  • शुद्ध

    पहली समस्या

    पहला मुद्दा है कि मैं दो विशिष्ट नामित पाइप कि दो अलग-अलग कार्यक्रमों में थे था। पाइप: // localhost/superuniquepipe2

हालांकि, लॉन्च करने वाला दूसरा प्रोग्राम अपवाद फेंक देगा (मैं बेली पहले से ही उपयोग में होने वाले पते के कारण ServiceHost खोलते समय यह पता था ADADreadyInUseException)।

Uri[] baseAddresses = new Uri[] { new Uri("net.pipe://localhost") }; 
this.host = new ServiceHost(this, baseAddresses); 
this.host.AddServiceEndpoint(typeof(IHostType), new NetNamedPipeBinding(), "superuniquepipe1"); 
this.host.Open(); 

तो मैं स्थानीय होस्ट पहले के आधार पता तरीका निर्दिष्ट करें, और फिर जब अंत बिंदु जोड़ने बाकी निर्दिष्ट करते हैं,:

तरह से मैं था इन ServiceHosts instantiating इस प्रकार था मैं का समाधान इस कोड को परिवर्तित करने के लिए था इस प्रकार है:

this.host = new ServiceHost(this); 
this.host.AddServiceEndpoint(typeof(IHostType), new NetNamedPipeBinding(), "net.pipe://localhost/superuniquepipe2"); 
this.host.Open(); 

एम आई कारण यह काम किया कह में सही कर क्योंकि यह केवल आधार पतों की जाँच कर रहा था और नहीं endpoint मैं जोड़ने की कोशिश कर रहा था? और दूसरा कोड नमूना "लोकलहोस्ट" पर कई प्रोग्राम सुनने के लिए वैध/सुरक्षित तरीका का उपयोग कर रहा है?

दूसरी समस्या:

ऊपर ठीक करने के लिए की कोशिश में, मैं आधार का पता स्थानीय होस्ट से अलग अद्वितीय तार के एक नंबर करने के लिए जैसे बदल गया था "net.pipe: // rawrwhyisntthisworkingsadface", लेकिन ऐसा करने पर मुझे एक कनेक्शन स्थापित करने की कोशिश कर रहे क्लाइंट से एक अमान्य प्रमाणीकरण अपवाद प्रस्तुत किया जाएगा (नीचे कोड देखें)

मैं इंप्रेशन के तहत था नामित पाइप सचमुच हो सकता है कुछ भी नाम दिया, क्या कोई इस पर कुछ प्रकाश डाल सकता है?

ChannelFactory<IHostType> factory = new ChannelFactory<IHostType>(new NetNamedPipeBinding(), new EndpointAddress("net.pipe://rawrwhyisntthisworkingsadface/superuniquepipe2")); 
IHostType proxy = factory.CreateChannel(); 
proxy.CallSomeMethodAndGetAnException(); 

किसी भी इनपुट बहुत सराहना की जाएगी जैसा कि मैंने कहा मैं इस मुद्दे को हल कर दिया है और सिर्फ जानना क्यों मेरे समाधान काम चाहते हैं, लेकिन अगर तुम मैं इसे कैसे हल कर ली है में एक दोष देख सकते हैं और एक बेहतर कर सकते हैं सुझाव कर यह कर लें, ताकि :) कर के रास्ते

+0

इस पर विस्तार करने के लिए, मैं एक ही समस्या मैं belive हो रही है, और इस अपवाद है: ** [TYPE]: ** System.ServiceModel.AddressAlreadyInUseException ** [MESSAGE]: ** नहीं कर सकते पाइप नाम 'net.pipe: // localhost /' पर सुनें क्योंकि एक और पाइप एंडपॉइंट पहले से ही उस नाम पर सुन रहा है। – ebol2000

उत्तर

13

पुन समस्या 1:

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

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

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

पुन समस्या 2:

सेवा पक्ष आप सेवा URL का होस्ट नाम भाग के लिए कुछ भी उपयोग कर सकते हैं पर। यह NetNamePipeBinding में डिफ़ॉल्ट रूप से लागू HostNameComparisonMode सेटिंग के कारण है, क्योंकि डब्ल्यूसीएफ में एल्गोरिदम जो साझा स्मृति प्रकाशन स्थान के लिए नाम प्राप्त करता है, होस्ट किए गए होस्ट नाम तुलना मोड को कार्यान्वित करने के लिए होस्ट नाम see here के लिए वाइल्डकार्ड वर्ण को प्रतिस्थापित करता है।

ग्राहक पक्ष पर, हालांकि, सेवा यूआरएल बाधित है: मेजबान भाग को स्थानीय स्तर पर वास्तविक रूप से हल करना चाहिए (यानी यह localhost, सही आईपी पता, या सही मशीन नाम) है।

+0

सभी जानकारी के लिए धन्यवाद, बहुत सराहना की :) – rastating