2010-03-31 12 views
16

हमें एक वेब सेवा का उपयोग करना है जो साबुन 11 का उपयोग करता है ... कोई समस्या नहीं है मैं बस बाध्यकारी सेट करूँगा:मैं इस कस्टम बाध्यकारी प्रोग्रामेटिक रूप से कैसे बना सकता हूं?

BasicHttpBinding wsBinding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential); 

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

<bindings> 
    <customBinding> 
     <binding name="lbinding"> 
      <security authenticationMode="UserNameOverTransport" 
       messageSecurityVersion="WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11" 
       securityHeaderLayout="Strict" 
       includeTimestamp="false" 
       requireDerivedKeys="true" 
       keyEntropyMode="ServerEntropy"> 
      </security> 
      <textMessageEncoding messageVersion="Soap11" /> 
      <httpsTransport authenticationScheme ="Negotiate" requireClientCertificate ="false" realm =""/> 
     </binding> 
    </customBinding> 
</bindings> 

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

उत्तर

28

इसे हल किया गया!

यहां एक समान परिस्थिति में रहने वाले लोगों के लिए विजेता कोड है।

Uri epUri = new Uri(_serviceUri); 
CustomBinding binding = new CustomBinding(); 
SecurityBindingElement sbe = SecurityBindingElement.CreateUserNameOverTransportBindingElement(); 
sbe.MessageSecurityVersion = MessageSecurityVersion.WSSecurity11WSTrustFebruary2005WSSecureConversationFebruary2005WSSecurityPolicy11;   
sbe.SecurityHeaderLayout = SecurityHeaderLayout.Strict; 
sbe.IncludeTimestamp = false; 
sbe.SetKeyDerivation(true); 
sbe.KeyEntropyMode = System.ServiceModel.Security.SecurityKeyEntropyMode.ServerEntropy; 
binding.Elements.Add(sbe); 
binding.Elements.Add(new TextMessageEncodingBindingElement(MessageVersion.Soap11, System.Text.Encoding.UTF8)); 
binding.Elements.Add(new HttpsTransportBindingElement()); 
EndpointAddress endPoint = new EndpointAddress(epUri); 
+0

इसके लिए धन्यवाद .. मेरे पास एक समान समस्या थी जहां मुझे एक और कक्षा प्रोजेक्ट बनाना था जिसमें बाहरी सेवा कॉल करने के लिए तर्क शामिल था। मैंने वास्तव में APP.config से कॉन्फ़िगरेशन को अंतर्निहित web.config पर नहीं ले जाया था - और इसलिए उपर्युक्त समाधान सेवा परिभाषा को ओवरराइड करने के लिए इस उदाहरण के लिए बिल्कुल सही है। –

5

@ डी। फोरेस्ट को पहले से ही समाधान मिला है, लेकिन यह देखने का एक आसान तरीका है कि किसी दिए गए डब्ल्यूसीएफ कॉन्फ़िगरेशन के लिए कौन सी ऑब्जेक्ट्स शामिल हैं, क्लाइंट प्रॉक्सी पर .Endpoint.Binding.CreateBindingElements() पर कॉल करना है। आप लौटाई गई सूची में प्रत्येक आइटम के ऑब्जेक्ट पेड़ को डंप कर सकते हैं और देख सकते हैं कि बाध्यकारी कैसे कॉन्फ़िगर किया गया है।

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