2009-02-03 14 views
8

में एकाधिक आधार पते मेरे पास एक ऐसा वातावरण है जहां एक ही सर्वर पर होस्ट की गई कई साइटें कॉल करने के लिए एक ही सेवा का उपयोग करेंगी। उदाहरण के लिए:एकल डब्ल्यूसीएफ सेवा

http://domain1.com/Api/Service.svc

http://domain2.com/Api/Service.svc

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

<serviceHostingEnvironment>  
    <baseAddressPrefixFilters>   
    <add prefix="http://domain1.com/Api" /> 
    <!--<add prefix="http://domain2.com/Api" />--> 
    </baseAddressPrefixFilters> 
</serviceHostingEnvironment> 

हालांकि डोमेन 1 के लिए यह केवल काम करता है, क्योंकि आप केवल एक baseAddressPrefixFilter की अनुमति हो (वे इसे baseAddressPrefixFilter नहीं बुलाना चाहिए एस यदि आपको केवल एक की अनुमति है)। मैंने इसके चारों ओर जाने के लिए कस्टम सर्विसहोस्ट फैक्ट्री बनाने की कोशिश की, लेकिन सर्विसहोस्ट फैक्ट्री को सक्रियण प्रक्रिया में बुलाए जाने से पहले मैं फिल्टर समस्या में भाग गया।

कैसे एक भी सेवा इस तरह 2 डोमेन पर काम करने के लिए पर कोई भी विचार? लेकिन प्रोटोकॉल के अनुसार केवल एक - -

उत्तर

5

ठीक है, अंत बिंदु संबोधन में पूरे यूआरएल डाल, कुछ मैं के बारे में सोचा नहीं था। कस्टम सेवाहोस्ट फैक्टरी का उपयोग करने के बाद, जो डोमेन 1 के लिए काम करता था, लेकिन डोमेन 2 के लिए नहीं। मुझे एक नया त्रुटि संदेश मिला है जो मैंने पहले नहीं देखा है:

"कोई प्रोटोकॉल बाइंडिंग दिए गए पते से मेल नहीं खाता 'http://domain2.com/Api/Poll.svc/soap'। प्रोटोकॉल बाइंडिंग आईआईएस या डब्ल्यूएएस कॉन्फ़िगरेशन में साइट स्तर पर कॉन्फ़िगर किया गया है।"

अद्यतन:

ठीक है, मैं यह समझ से बाहर (अंत में!)। मैं सेवा परिभाषा में एक होस्ट नोड जोड़ सकता हूं और प्रत्येक एंडपॉइंट में पूर्ण यूआरएल का उपयोग करने से बच सकता हूं। मैंने BaseAddressPrefixFilter को भी हटा दिया, लेकिन समाधान में कस्टम सेवाहोस्ट फैक्टरी को रखा।

<service name="Poll"> 
    <host> 
     <baseAddresses> 
     <add baseAddress="http://domain1.com/Api"/> 
     <add baseAddress="http://domain2.com/Api"/> 
     </baseAddresses> 
    </host> 
    <endpoint address="soap" binding="basicHttpBinding" bindingConfiguration="soapBinding" 
     contract="IPoll" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />   
    </service> 

मैं चिंतित मैं हर बंधन के लिए प्रत्येक डोमेन, जो अतिरिक्त config का एक बहुत का प्रबंधन करने के लिए हो गया होता कि समाप्ति बिंदु लिखने के लिए जा रहा था। यह समाधान बहुत अच्छा है क्योंकि मुझे ऐसा करने की ज़रूरत नहीं है, यह थोड़ा और संक्षिप्त है।

संदर्भ के लिए, यहां मेरी सेवाहोस्ट फैक्ट्री क्लास है। यह बहुत आसान है, लेकिन यह आवश्यक है। एक बार जब आप इस किया है, आप भी अपनी .svc फ़ाइल की मार्कअप संशोधित करने के लिए फैक्टरी में शामिल करने के लिए है: फैक्टरी = "Api.ServiceHostFactory"

public class MyServiceHostFactory : System.ServiceModel.Activation.ServiceHostFactory 
{ 
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    {       
     ServiceHost host; 

     host = new ServiceHost(serviceType, baseAddresses[0]); 

     return host; 
    } 
} 
+0

ठीक है, अगर केवल एमएस ने इसे ठीक से दस्तावेज करने के लिए परेशान किया था। Http://blogs.msdn.com/b/rampo/archive/2008/02/11/how-can-wcf-support-multiple-iis-binding-specified-per-site.aspx पर उनका उत्तर बस काम करने में विफल रहा बिलकुल। –

1

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

+1

मार्क, इस "प्रोटोकॉल के अनुसार एक उपसर्ग" सीमा के पीछे तर्क क्या है ? –

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