2010-03-31 20 views
16

Tenemos que acceder a un servicio web que utiliza soap11 ... no hay problema yo sólo va a establecer la unión como:¿Cómo puedo crear programáticamente este enlace personalizado?

BasicHttpBinding wsBinding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential); 

Nop. No dados. Así que le pedí el anfitrión del servicio de por qué estamos teniendo problemas de autenticación y me dijo que nuestra configuración necesaria para que esta unión de encargo:

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

El único problema es que estamos creando nuestra programación no vinculante a través de la configuración. Entonces, si alguien puede señalarme en la dirección correcta con respecto a cambiar mi BasicHttpBinding en un custombinding que se ajuste al valor .config proporcionado, les daré una gran estrella de oro brillante por el día.

Respuesta

28

¡Solucionado!

Aquí está el código ganador para aquellos que se encuentran en una situación similar.

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

Gracias por esto .. Tuve un problema similar cuando tuve que crear otro proyecto de clase que contuviera lógica para realizar una llamada de servicio externo. Realmente no (no pude) mover la configuración de la aplicación.config a la web.config subyacente, por lo que las soluciones anteriores son perfectas para esta instancia, para anular la definición del servicio. –

5

@D. Forrest ya encontró la solución, pero una forma simple de ver qué objetos están involucrados para una configuración de WCF determinada es llamar al .Endpoint.Binding.CreateBindingElements() en el proxy del cliente que está utilizando. Puede volcar el árbol de objetos de cada elemento en la lista que se devuelve y ver cómo se configura el enlace.

Cuestiones relacionadas