2010-12-03 5 views
19

मैंने अपनी डब्ल्यूसीएफ सेवाओं को कॉन्फ़िगर करने के तरीके को समझने में काफी समय बिताया ताकि वे उत्पादन वातावरण में https के लिए काम करेंगे।मैं एक web.config में http और https दोनों के लिए डब्ल्यूसीएफ सेवा कॉन्फ़िगरेशन को कैसे जोड़ सकता हूं?

असल में, मैं यह करने के लिए आवश्यक:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MyServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
<services> 
    <service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior"> 
    <endpoint address="" bindingNamespace="https://secure.mydomain.com" binding="basicHttpBinding" bindingConfiguration="HttpsBinding" contract="MyNamespace.IMyService"/> 
    </service> 
</services> 
<bindings> 
    <basicHttpBinding> 
    <binding name="HttpsBinding"> 
     <security mode="Transport"> 
     <transport clientCredentialType="None"></transport> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

जोड़ना समाप्ति बिंदु को bindingNamespace विशेषता अंतिम बात यह है कि यह काम किया जाता है।

लेकिन यह कॉन्फ़िगरेशन मेरे स्थानीय देव पर्यावरण में काम नहीं करता है जहां मैं नियमित http के तहत काम कर रहा हूं। तो मेरी config है:

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MyServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="false" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
<services> 
    <service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior"> 
    <endpoint address="" binding="basicHttpBinding" contract="MyNamespace.IMyService"/> 
    </service> 
</services> 

यहाँ मतभेद मैं गलत पर httpsGetEnabled विशेषता सेट कर लिया है कर रहे हैं, और मैं bindingConfiguration और bindingNamespace हटा दिया।

समस्या यह है: मैं एक कॉन्फ़िगरेशन ब्लॉक कैसे बना सकता हूं जो दोनों को संभालता है?

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

<behaviors> 
    <serviceBehaviors> 
    <behavior name="MyServiceBehavior"> 
     <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" /> 
     <serviceDebug includeExceptionDetailInFaults="true" /> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" /> 
<services> 
    <service name="MyNamespace.MyService" behaviorConfiguration="MyServiceBehavior"> 
    <endpoint address="" binding="basicHttpBinding" contract="MyNamespace.IMyService"/> 
    <endpoint address="" bindingNamespace="https://secure.mydomain.com" binding="basicHttpBinding" bindingConfiguration="HttpsBinding" contract="MyNamespace.IMyService"/> 
    </service> 
</services> 
<bindings> 
    <basicHttpBinding> 
    <binding name="HttpsBinding"> 
     <security mode="Transport"> 
     <transport clientCredentialType="None"></transport> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

मैं लगा कि दोनों अंतिमबिंदुओं डाल यह दो विकल्प जब सेवा को सक्रिय करने के लिए देखने के लिए देना होगा:

मैं कुछ इस तरह की कोशिश की। हालांकि, यह काम नहीं करता है। मुझे यह त्रुटि मिलती है:

बेसिक एचटीपीबी बाइंडिंग बाध्यकारी के साथ एंडपॉइंट के लिए योजना https से मेल खाता एक आधार पता नहीं मिला। पंजीकृत आधार पता योजनाएं [http] हैं।

एसओ और बाकी इंटरनेट के आसपास देखने से, ऐसा लगता है कि दूसरों को इस ड्रैगन को मारने में समस्याएं आई हैं।

+0

क्या आप आईआईएस में अपनी डब्ल्यूसीएफ सेवा होस्ट कर रहे हैं, या आप स्वयं-होस्टिंग कर रहे हैं ?? –

+0

उन्हें एएसपी.NET वेब एप्लिकेशन में .svc फ़ाइलों के रूप में होस्ट किया जा रहा है। देव और प्रोड दोनों पर आईआईएस 7 का उपयोग करना। – sohtimsso1970

+0

@ sohtimsso1970: क्या आपको इसका समाधान मिला? – Learner

उत्तर

11

ठीक है, आपकी संयुक्त कॉन्फ़िगरेशन के साथ एक समस्या यह है कि आपके दो अंत बिंदु एक ही पते पर हैं - जो काम नहीं करेगा।

यदि आप आईआईएस में होस्टिंग कर रहे हैं, तो आपका सर्वर, आभासी निर्देशिका और *।एसवीसी फ़ाइल आवश्यकता के अनुरूप अपने बुनियादी पते का निर्धारण करेगा - यह की तरह कुछ हो जाएगा:

http://yourservername/VirtualDirectory/YourService.svc 

आप उनमें से कम से कम एक एक रिश्तेदार का पता परिभाषित करने की जरूरत है दो समाप्ति बिंदुओं, करना चाहते हैं:

<services> 
    <service name="MyNamespace.MyService" 
      behaviorConfiguration="MyServiceBehavior"> 
     <endpoint 
      address="basic" 
      binding="basicHttpBinding" 
      contract="MyNamespace.IMyService"/> 
     <endpoint 
      address="secure" 
      binding="basicHttpBinding" bindingConfiguration="HttpsBinding" 
      contract="MyNamespace.IMyService"/> 
    </service> 
</services> 

http://yourservername/VirtualDirectory/YourService.svc/basic 

और अपने सुरक्षित HTTPS अंतबिंदु पर:

इस मामले में, आप पर अपने HTTP समाप्ति बिंदु होगा

इसके अलावा: अपने सुरक्षित endpoint एक HttpsBinding विन्यास का उपयोग करता है - लेकिन आप इस तरह के एक बाध्यकारी विन्यास की कमी कर रहे हैं - तुम सब है:

<bindings> 
    <basicHttpBinding> 
    <binding name="HttpBinding"> 
     <security mode="None"> 
     <transport clientCredentialType="None"></transport> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 

आप HttpsBinding विन्यास जोड़ने की जरूरत है !!

<bindings> 
    <basicHttpBinding> 
    <binding name="HttpBinding"> 
     <security mode="None"> 
     <transport clientCredentialType="None"></transport> 
     </security> 
    </binding> 
    <binding name="HttpsBinding"> 
     <security mode="Transport"> 
      <transport clientCredentialType="Windows" /> 
     </security> 
    </binding> 
    </basicHttpBinding> 
</bindings> 
+0

निरीक्षण के लिए खेद है, लेकिन मेरे पास वास्तव में सुरक्षित बाध्यकारी है। यदि आप मेरी शीर्ष कॉन्फ़िगरेशन को देखते हैं - सर्वर पर एक - इसमें जगह पर Https बाइंडिंग है। एसओ प्रश्न बनाते समय मैंने जो संयुक्त कोड पोस्ट किया था, वह मैन्युअल रूप से मेरे द्वारा क्यूरेट किया गया था। – sohtimsso1970

+2

यदि मैं समझता हूं कि एंडपॉइंट पते कैसे काम करते हैं, तो उन सापेक्ष स्थानों को जोड़कर यूआरएल का उपयोग किया जाएगा। मैं देव और प्रोड दोनों में एक ही यूआरएल का उपयोग करना चाहता हूं। इसलिए मैं अंत में "मूल" या "सुरक्षित" जोड़ना नहीं चाहता क्योंकि सिर्फ https पर स्विच किया गया था। क्या आप कह रहे हैं कि यह अन्यथा संभव नहीं है? – sohtimsso1970

+3

क्या आपको कभी भी एक ही एंडपॉइंट पर HTTP/HTTPS को सक्षम करने का समाधान मिला? मैं एक ही स्थिति में हूं - अनिवार्य रूप से मैं कोड – StickyMcGinty

2

समस्या कॉन्फ़िगरेशन फ़ाइल के साथ नहीं है, लेकिन आईआईएस सेटअप के साथ है। आपको आईआईएस में HTTP & HTTPS दोनों को सक्षम करने की आवश्यकता है। आईआईएस 7.5 में, अपनी साइट पर जाएं और संपादन साइट एक्शन के तहत बाइंडिंग पर क्लिक करें। सुनिश्चित करें कि http & https दोनों को जोड़ा गया है। फिर आपको सुरक्षा मोड के साथ सेट किए गए <basicHttpBinding> के तहत HTTP के लिए बाध्यकारी बनाने की आवश्यकता है। नव निर्मित बाध्यकारी विन्यास http endpoint में जोड़ें। आप जाने के लिए अच्छे हैं। अगर आपको और समस्या की आवश्यकता है तो मुझे बताएं।

+0

मेरा मुद्दा: _bindings_ ('(टाइप: होस्टनाम: पोर्ट)') आईआईएस में: *** http: कोई होस्टनाम नहीं: 4975 9 ***, *** https: pre.company.es: 443 *** और * ** http: pre.company.es: 80 ***, और *** बेसड्रेस ***: _http: // preserver: 49759/vdir1/SilverlightServices/serv.svc_ और _https: //pre.company.es /vdir1/SilverlightServices/serv.svc_ – Kiquenet

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