2010-03-31 11 views
16

Dobbiamo accedere a un servizio Web che utilizza soap11 ... nessun problema mi limiterò a impostare il binding come:Come posso creare questa associazione personalizzata al livello di programmazione?

BasicHttpBinding wsBinding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential); 

Nope. Niente da fare. Così ho chiesto l'host del servizio perché stiamo avendo problemi di autenticazione e mi ha detto che la nostra configurazione necessari per avere questo costume vincolante:

<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> 

L'unico problema è che stiamo creando il nostro non vincolante a livello di codice tramite la configurazione. Quindi, se qualcuno potrebbe indicarmi la giusta direzione per quanto riguarda la modifica del mio BasicHttpBinding in una custombinding conforme al valore .config fornito darò loro una grande stella d'oro lucente per il giorno.

risposta

28

Risolto!

Ecco il codice vincente per coloro che si trovano in una situazione simile.

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

Grazie per questo .. Avevo un problema simile in cui dovevo creare un altro progetto di classe che contenesse la logica per eseguire una chiamata di servizio esterna. Non ho davvero (non potuto) spostare la configurazione da app.config al web.config sottostante - e quindi le soluzioni di cui sopra sono perfette per questa istanza, per sovrascrivere la definizione del servizio. –

5

@D. Forrest ha già trovato la soluzione, ma un modo semplice per vedere quali oggetti sono coinvolti per una determinata configurazione WCF è chiamare .Endpoint.Binding.CreateBindingElements() sul proxy client che si sta utilizzando. È possibile eseguire il dump dell'albero degli oggetti di ciascun elemento nell'elenco che viene restituito e vedere come viene configurato il binding.

Problemi correlati