2009-04-28 15 views
7

पर आधारित डब्ल्यूसीएफ सेवा संदर्भ यूआरएल बदलना मेरे पास एक वेब एप्लिकेशन है जो कई डब्ल्यूसीएफ सेवाओं का उपयोग करता है। मैं अपने वेब अनुप्रयोग को विभिन्न वातावरण (देव, यूएटी, उत्पादन इत्यादि) में तैनात करता हूं। प्रत्येक पर्यावरण के लिए प्रत्येक डब्ल्यूसीएफ सेवा का यूआरएल अलग है। मैं .NET 3.5 और basicHttpBinding sपर्यावरण

वेब एप्लिकेशन मेरी web.config फ़ाइल में मशीन-विशिष्ट सेटिंग्स का समर्थन करने के लिए एक ढांचे का उपयोग करता हूं।

System.ServiceModel.Channels.Binding binding, 
System.ServiceModel.EndpointAddress remoteAddress 

संक्षेप में web.config में <system.serviceModel><bindings><basicHttpBinding><binding> विन्यास दोहराया गया है: जब एक WCF सेवा क्लाइंट का एक उदाहरण instantiating मैं एक समारोह है कि निर्माता अधिभार कि तर्क लेता है का उपयोग कर WCF सेवा क्लाइंट के कहने बनाता है फोन सी # कोड में।

यह दृष्टिकोण अच्छी तरह से काम करता है।

हालांकि, अब मुझे एक डब्ल्यूसीएफ सेवा के साथ काम करने के लिए इस दृष्टिकोण को बढ़ाने की ज़रूरत है जो X509 प्रमाण पत्र का उपयोग करता है। इसका मतलब यह है कि मैं सी # कोड में web.config में निम्नलिखित अतिरिक्त सेटिंग्स को दोहराने के लिए है:

<!-- inside the binding section --> 
<security mode="Message"> 
    <transport clientCredentialType="None" proxyCredentialType="None" realm="" /> 
    <message clientCredentialType="Certificate" algorithmSuite="Default" /> 
</security> 


<behaviors> 
    <endpointBehaviors> 
    <behavior name="MyServiceBehaviour"> 
     <clientCredentials> 
     <clientCertificate storeLocation="LocalMachine" storeName="My" 
      x509FindType="FindByThumbprint" findValue="1234abcd" /> 
     <serviceCertificate> 
      <defaultCertificate storeLocation="LocalMachine" storeName="My" 
      x509FindType="FindByThumbprint" findValue="5678efgh" /> 
      <authentication trustedStoreLocation="LocalMachine" 
      certificateValidationMode="None" /> 
     </serviceCertificate> 
     </clientCredentials> 
    </behavior> 
    </endpointBehaviors> 
</behaviors> 

मैं कुछ कठिनाई पता लगाना सी # में इस विन्यास कोड करने के लिए कैसे हो रहा है।

दो सवाल

  • किसी को भी कई वातावरण भर में WCF सेवा संदर्भ यूआरएल के प्रबंधन के लिए एक बेहतर दृष्टिकोण की सिफारिश कर सकते हैं?
  • वैकल्पिक रूप से, कैसे सी # में ऊपर web.config अनुभाग को दोहराने के लिए पर कोई सुझाव
  • स्वागत किया जाएगा
+1

मेरे उत्तर में कुछ अतिरिक्त विचार जोड़े गए - आप नामित बाइंडिंग इत्यादि के साथ इस तरह से जा सकते हैं कि आप अपने पर्यावरण के आधार पर नाम निर्धारित कर सकें और फिर अपनी कॉन्फ़िगरेशन फ़ाइल से उपयुक्त मान लोड कर सकें। –

+0

निम्नलिखित प्रश्न इस http://stackoverflow.com/questions/798684/programmatically-set-identity-on-wcf-endpointaddress –

+0

से संबंधित हैं, मुझे एहसास है कि आप कॉन्फ़िगरेशन फ़ाइलों की बजाय कोड में ऐसा कर रहे हैं, लेकिन कॉन्फ़िगरेशन का उपयोग क्यों नहीं करते परिवर्तन और उचित कॉन्फ़िगरेशन फ़ाइल (Web.config.dev, Web.config.Test, Web.config.Release, आदि) में पर्यावरण विशिष्ट सेटिंग्स रखें? – camainc

उत्तर

1

निम्नलिखित कोड अपने मूल प्रश्न में विन्यास replicates:

myClient.ClientCredentials.ClientCertificate.SetCertificate(
    StoreLocation.LocalMachine, 
    StoreName.My, 
    X509FindType.FindByThumbprint, 
    "1234abcd"); 

myClient.ClientCredentials.ServiceCertificate.SetDefaultCertificate(
    StoreLocation.LocalMachine, 
    StoreName.My, 
    X509FindType.FindByThumbprint, 
    "5678efgh"); 

myClient.ClientCredentials.ServiceCertificate.Authentication.TrustedStoreLocation = StoreLocation.LocalMachine; 
myClient.ClientCredentials.ServiceCertificate.Authentication.CertificateValidationMode = X509CertificateValidationMode.None; 

उत्पादन कोड दो थंबप्रिंट मान web.config फ़ाइल में appSettings में जमा हो जाती है।

4

एक संभव दृष्टिकोण "बाह्यरूप" के लिए बाहरी फ़ाइलों में अपने <system.serviceModel> विन्यास के कुछ भागों होगा प्रति पर्यावरण एक।

उदा। हम "bindings.dev.config" और "bindings.test.config" है, जो हम तो इस तरह हमारे मुख्य web.config में संदर्भ है:

<system.serviceModel> 
    <bindings configSource="bindings.dev.config" /> 
</system.serviceModel> 

इस तरह, तुम सब देव से उत्पादन में बदलने की जरूरत है यह कॉन्फ़िगर एक्सएमएल की एक पंक्ति है।

असल में, .NET 2.0 कॉन्फ़िगरेशन में, किसी भी कॉन्फ़िगरेशन तत्व को "बाहरी" किया जा सकता है। हालांकि आप configGroups (जैसे "system.serviceModel") को बाहरी रूप से बाहरी नहीं कर सकते हैं - आपको "कॉन्फ़िगरेशन तत्व" स्तर पर होना होगा।

मार्क

संपादित करें: ठीक है, तो नहीं config संपादित परिवर्तन वातावरण के बीच स्विच करने ..... उस मामले में, आप शायद एक नामकरण योजना भी कल्पना करने के लिए है, उदाहरण के लिए अपने बाइंडिंग, व्यवहार और एंडपॉइंट्स को इस तरह से नाम दें, कि आप रनटाइम पर उन्हें अलग कर सकते हैं।

कुछ की तरह:

<bindings> 
    <binding name="Default_DEV"> 
    ..... 
    </binding> 
    <binding name="Default_PROD"> 
    ..... 
    </binding> 
</bindings> 

कि जिस तरह से, आप तत्व के नाम का निर्माण कर सकता है आप चाहते हैं अपने कोड और पर्यावरण आप में चला रहे हैं से (उदाहरण के लिए बाइंडिंग "Default_PROD"), और फिर हड़पने कॉन्फ़िगरेशन फ़ाइल से कॉन्फ़िगर कॉन्फ़िगरेशन जिसमें सभी वातावरण के लिए सभी कॉन्फ़िगरेशन सेटिंग्स शामिल हैं।

+0

मुझे वास्तव में एक विकल्प की आवश्यकता है जिसके लिए वातावरण के बीच शून्य कॉन्फ़िगरेशन फ़ाइल परिवर्तन की आवश्यकता है ... –

1

हम web.config फ़ाइलों का बिल्कुल उपयोग नहीं करते हैं, हम प्रोग्रामेटिक रूप से सबकुछ निर्दिष्ट करते हैं और केंद्रीकृत डेटाबेस से सभी कॉन्फ़िगरेशन लोड करते हैं।

+0

क्या आप किसी भी डब्ल्यूसीएफ सेवाओं का उपयोग करते हैं जिन्हें X509 प्रमाणपत्र की आवश्यकता होती है? –

+1

क्षमा करें नहीं, लेकिन हमारे पास अलग-अलग विकल्प और प्रकार के बाइंडिंग हैं जो हम net.tcp, basicHttp, WS * का समर्थन करते हैं)। यूआरएल के आधार पर, हम डेटाबेस में विभिन्न विन्यासों को देखते हैं और गतिशील रूप से उपयुक्त के रूप में कॉन्फ़िगर करते हैं। यह अपेक्षाकृत सीधे आगे है और विन्यास के भार से दूर है। हम एक वेब-फार्म पर्यावरण पर भी तैनात कर सकते हैं और इसे केंद्रीय रूप से कॉन्फ़िगर करने की अनुमति दे सकते हैं। – Bigtoe

+0

कोई समस्या नहीं - एक अच्छा दृष्टिकोण की तरह लगता है –

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