WCF सेवा स्टार्टअप त्रुटि "इस संग्रह में पहले से ही योजना http के साथ एक पता शामिल है"


182

मैंने WCF सेवा अनुबंध और सिल्वरलाइट नियंत्रण युक्त एक वेब एप्लिकेशन बनाया, जो उस WCF सेवा को कॉल करता है। मेरे विकास और परीक्षण सर्वर पर यह बहुत अच्छा काम करता है।

जब मैं हमारे लाइव सर्वर पर तैनात होता हूं और एप्लिकेशन चलाता हूं तो मुझे एक प्रकार का अपवाद मिलता है System.ServiceModel.ServiceActivationExceptionजो बताता है कि संकलन के अपवाद के कारण सेवा को सक्रिय नहीं किया जा सकता है। अपवाद है:

इस संग्रह में पहले से ही स्कीम http वाला एक पता है। इस संग्रह में प्रति योजना अधिकतम एक पता हो सकता है।

मैंने पढ़ा कि यदि वेब साइट में एक से अधिक होस्ट हेडर हैं, जो हमारे लाइव सर्वर पर सच है, तो यह अपवाद फेंका जा सकता है। IIS में होस्ट की गई WCF सेवाओं में केवल एक आधार पता हो सकता है। मैं इस मुद्दे के आसपास कैसे पहुंच सकता हूं?

जवाबों:


167

.Net 4 में, आप multipleSiteBindingsEnabledविकल्प का उपयोग कर सकते हैं :

<system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true">
    </serviceHostingEnvironment>
</system.serviceModel>

फिर, आपको प्रत्येक पता निर्दिष्ट नहीं करना होगा।

http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehostingenvironment.multiplesitebindingsenabled.aspx


हां, लेकिन यह केवल .NET 4.0 और उच्चतर के साथ काम करता है। .NET 2.0 / 3.0 / 3.5 साइटों के साथ इसका उपयोग करने में सक्षम नहीं है।
बाइटमास्टर

2
नोट - उसमें कोई लेखन त्रुटि यहाँ है - कोई समापन है>, इसलिए यदि आप कॉपी और पेस्ट, तो आप मुसीबत होगा
sydneyos

2
यह इस सवाल के लिए काम नहीं करेगा: "यह कार्यक्षमता केवल HTTP प्रोटोकॉल का उपयोग करके उपलब्ध है।"
जॉर्ज त्सीकोस

146

सारांश,

कोड समाधान: यहाँ

विन्यास समाधान: यहाँ

माइक चली की मदद से , मुझे कोड के माध्यम से यह करने के लिए कुछ समाधान मिले। क्योंकि यह समस्या उन सभी परियोजनाओं को प्रभावित करने वाली है, जिन्हें हम एक ऐसे वातावरण में तैनात करते हैं जिसे मैं पूरी तरह से कॉन्फ़िगरेशन समाधान के लिए आयोजित करता हूं। मैंने अंततः एक विवरण प्राप्त किया जो इसे .net 3.0 और .net 3.5 में कैसे करना है।

साइट से लिया गया, नीचे एक उदाहरण है कि आपके एप्लिकेशन वेब कॉन्फ़िगरेशन को कैसे बदलना है:

<system.serviceModel>
    <serviceHostingEnvironment>
        <baseAddressPrefixFilters>
            <add prefix="net.tcp://payroll.myorg.com:8000"/>
            <add prefix="http://shipping.myorg.com:9000"/>
        </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
</system.serviceModel>

उपरोक्त उदाहरण में, net.tcp: //payroll.myorg.com: 8000 और http://shipping.myorg.com:9000 एकमात्र आधार पते हैं, जो अपनी संबंधित योजनाओं के लिए हैं, जिन्हें पारित करने की अनुमति होगी। BaseAddressPrefixFilter किसी वाइल्डकार्ड का समर्थन नहीं करता है।

IIS द्वारा आपूर्ति की गई baseAddresses में आधार योजना में मौजूद अन्य योजनाओं के पते नहीं हो सकते हैं। इन पतों को फ़िल्टर नहीं किया जाएगा।

डीएनएस समाधान (अप्रकाशित): मुझे लगता है कि अगर आपने अपने वेब एप्लिकेशन के लिए एक नया डीएनएस प्रविष्टि बनाया है, तो एक नई वेब साइट को जोड़ा, और इसे डीएनएस प्रविष्टि से मेल खाते एक एकल होस्ट हेडर दिया, आप इस मुद्दे को पूरी तरह से कम कर देंगे, और नहीं कस्टम कोड लिखना होगा या अपनी web.config फ़ाइल में उपसर्ग जोड़ना होगा।


2
वेब के लिए आधार पता उपसर्ग फ़िल्टर जोड़ना। पूरी तरह से काम किया। धन्यवाद जेरेमी!
मिक .३37

2
मैं किसी भी कारण के बारे में नहीं सोच सकता कि कोई ऐसा प्रतिबंध क्यों चाहेगा, डिफ़ॉल्ट सेटिंग बहुत कम ...
pbz

42
मैं ASP.net और जावास्क्रिप्ट के माध्यम से एक्सेस की गई वेब सेवाओं के संयोजन में WCF के बारे में बुरी तरह से सोचना शुरू कर रहा हूं। मुझे सादे पुराने ASMX सेवाओं के साथ बहुत कम समस्याएं थीं ...
जूरी

ठीक है अगर आपके पास .net 4 और .net 2 अनुप्रयोगों के मिश्रण के साथ एक साइट है, तो इसके तहत चल रहा है। अनुप्रयोग का आधार .net4 है और इसके अंतर्गत कई अनुप्रयोग हैं जिनकी आवश्यकता .net2 है। क्या आप सभी .net4 फ़ाइलों और .net 2 अनुप्रयोगों में उपसर्गों में <serviceHostingEnvironment multipleSiteBindingsEnabled = "true"> का उपयोग करते हैं?
ट्रैविस

59

क्या आपने इसे देखा - http://kb.discountasp.net/KB/a799/error-accessing-wcf-service-this-collection-already.aspx

आप web.config फ़ाइल को बदलकर इस त्रुटि को हल कर सकते हैं।

ASP.NET 4.0 के साथ, निम्नलिखित पंक्तियों को अपने web.config में जोड़ें:

<system.serviceModel> 
     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 

ASP.NET 2.0 / 3.0 / 3.5 के साथ, निम्नलिखित पंक्तियों को अपने web.config में जोड़ें:

<system.serviceModel> 
     <serviceHostingEnvironment> 
          <baseAddressPrefixFilters> 
               <add prefix="http://www.YourHostedDomainName.com"/> 
          </baseAddressPrefixFilters> 
     </serviceHostingEnvironment> 
</system.serviceModel> 

धन्यवाद। मैं यह देखने के लिए खोज जारी रखने जा रहा हूं कि क्या कोई कोड समाधान नहीं है। कुछ ऐसा जो कॉन्फ़िगरेशन में किया जा सकता है क्योंकि यह किसी भी परियोजना को प्रभावित करने वाला है जिसे हम उम्मीद कर रहे हैं कि मुझे कस्टम कोड लिखने की ज़रूरत नहीं है।
जेरेमी

16

मेरे मामले में इस मुद्दे का मूल कारण मूल वेब साइट यानी InetMgr-> साइटें-> मैसाइट-> गुण-> EditBindings में परिभाषित कई http बाइंडिंग थे। मैंने एक http बाइंडिंग को हटा दिया, जिसकी आवश्यकता नहीं थी और समस्या हल हो गई।


1
हाँ अमर इस काफी मददगार था - मेरे मामले में यह था एक और कई बाइंडिंग कि इसे तोड़ दिया साथ वेबसाइट। बाह्य रूप से एक ही मशीन पर उपलब्ध (लेकिन एक अलग होस्टनाम के साथ)। समान रूप से यह कईSiteBindingsEnabled सेटिंग को जोड़कर तय किया जा सकता है लेकिन फिर web.config अन्य सभी वातावरणों से अलग होगा।
कोडर

2
यह शर्म की बात है कि यह सबसे नीचे है। हमारे मामले में यह हमारे लिए तय किया।
ब्रेंडनपॉकर

इसने मुझे विकास के माहौल में त्रुटि को दोहराने में मदद की। मैं न तो प्रमाणीकरण और न ही लाइव वातावरण में वेबसाइट बाइंडिंग को संपादित कर सकता हूं। मैंने एक डोमेन का अनुकरण करने के लिए अपनी मेजबानों की फाइल बदल दी है और स्थानीय IIS और bam में बाइंडिंग जोड़ दी है!
एमफेडैटो

8

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

बदलने के:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))

साथ में:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService))

और त्रुटि हो गई है।

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


मेरी समस्या का समाधान किया।
QShengyao

2

मुझे यह समस्या थी, और इसका कारण मूर्खतापूर्ण था। मैं एक कमांड लाइन के निष्पादन में w / से एक ServiceHost चलाने के बारे में Microsoft के डेमो की कोशिश कर रहा था। मैंने निर्देशों का पालन किया, जिसमें उपयुक्त सेवा (और इंटरफ़ेस) को जोड़ना शामिल है। लेकिन मुझे उपरोक्त त्रुटि मिली।

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


0

मैं एक पुराने 2010 एक्सचेंज सर्वर पर उसी त्रुटि से आया था। एक सेवा (एक्सचेंज मेलबॉक्स प्रतिकृति सेवा) उपरोक्त त्रुटि दे रही थी और माइग्रेशन प्रक्रिया को जारी नहीं रखा जा सकता था। इंटरनेट के माध्यम से खोज, मैं इस लिंक के द्वारा आया जो नीचे बताया गया है:

Exchange GRE पहली बार स्थापित होने पर या IIS सर्वर में कोई परिवर्तन किए जाने पर खुलने में विफल रहता है। यह स्नैप-इन त्रुटि के साथ विफल हो जाता है और जब आप स्नैप-इन पृष्ठ को खोलने का प्रयास करते हैं, तो निम्न सामग्री प्रदर्शित होती है:

This collection already contains an address with scheme http.  There can be at most one address per scheme in this collection. If your service is being hosted in IIS you can fix the problem by setting 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' to true or specifying 'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters'."

कारण : यह त्रुटि इसलिए होती है क्योंकि http पोर्ट नंबर 443 पहले से ही किसी अन्य एप्लिकेशन द्वारा उपयोग में है और IIS सर्वर को एक ही पोर्ट पर कई बाइंडिंग को संभालने के लिए कॉन्फ़िगर नहीं किया गया है।

उपाय : कई पोर्ट बाइंडिंग को संभालने के लिए IIS सर्वर कॉन्फ़िगर करें। इसे कॉन्फ़िगर करने के लिए विक्रेता (Microsoft) से संपर्क करें।

चूंकि ये सेवाएँ IIS वेब सर्वर से दी गई थीं, इसलिए रूट साइट पर बाइंडिंग की जाँच करने से समस्या ठीक हो गई। किसी ने साइट बाइंडिंग को गड़बड़ कर दिया था, नियमों को परिभाषित करते हुए जो खुद को ओवरलैप कर रहे थे और सेवाओं को गड़बड़ कर दिया था।

सही बाइंडिंग को ठीक करने से मेरे मामले में समस्या हल हो गई, और मुझे Web.Config को कॉन्फ़िगर करने की आवश्यकता नहीं थी।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.