2010-02-10 16 views
5

Me gustaría convertir mi actual configuración de enlace HTTP/HTTPS WCF para usar codificación de mensaje binario y necesito hacerlo en código, no en XML configuración. AFAIK es necesario crear objetos CustomBinding y establecer los BindingElements adecuados, pero no puedo descifrar qué elementos debo usar en mi escenario.WCF: cómo crear un enlace programáticamente personalizado con codificación binaria a través de HTTP (S)

puntos principales en la configuración de mi WCF son:

  • uso de HTTP o HTTPS transporte dependiendo de la configuración (en app.config)
  • uso de seguridad de mensajes nombre de usuario
  • TODO: añadir codificación binaria en lugar de por defecto texto

Mi código actual para el establecimiento de la unión hacia arriba (de trabajo, pero sin la codificación binaria):

var isHttps = Settings.Default.wcfServiceBaseAddress.StartsWith("https://", StringComparison.InvariantCultureIgnoreCase); 
var binding = new WSHttpBinding(isHttps ? SecurityMode.TransportWithMessageCredential : SecurityMode.Message); 
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName; 

yo estaba tratando de este código, pero no funciona - no sé cómo configurar elemento de seguridad para el mensaje de seguridad de los mensajes nombre de usuario:

var custBinding = new CustomBinding(); 
custBinding.Elements.Add(new BinaryMessageEncodingBindingElement()); 
//Transport Security (Not Required) 
if (isHttps) 
{ 
    custBinding.Elements.Add(SecurityBindingElement.CreateUserNameForSslBindingElement()); 
} 
//Transport (Required) 
custBinding.Elements.Add(isHttps ? 
    new HttpsTransportBindingElement() : 
    new HttpTransportBindingElement()); 

Alguien sabe cómo configurar esto? Traté de buscar un problema/solución similar, pero no lograba ...

Respuesta

7

casi se me olvida esta pregunta, pero aquí es mi clase personalizada de unión que funciona con el binario vinculante a través de HTTP con nombre de usuario + contraseña de validación y también permite a su vez la compresión gzip en ...

public class CustomHttpBinding: CustomBinding 
{ 
    private readonly bool useHttps; 
    private readonly bool useBinaryEncoding; 
    private readonly bool useCompression; 
    private readonly HttpTransportBindingElement transport; 

    public CustomHttpBinding(bool useHttps, bool binaryEncoding = true, bool compressMessages = false) 
    { 
     this.useHttps = useHttps; 
     transport = useHttps ? new HttpsTransportBindingElement() : new HttpTransportBindingElement(); 
     useBinaryEncoding = binaryEncoding; 
     useCompression = compressMessages; 
    } 

    public long MaxMessageSize{set 
    { 
     transport.MaxReceivedMessageSize = value; 
     transport.MaxBufferSize = (int) value; 
    }} 

    public override BindingElementCollection CreateBindingElements() 
    { 
     BindingElement security; 
     if (useHttps) 
     { 
      security = SecurityBindingElement.CreateSecureConversationBindingElement(
       SecurityBindingElement.CreateUserNameOverTransportBindingElement()); 
     } 
     else 
     { 
      security = SecurityBindingElement.CreateSecureConversationBindingElement(
       SecurityBindingElement.CreateUserNameForSslBindingElement(true)); 
     } 

     MessageEncodingBindingElement encoding; 
     if (useCompression) 
     { 
      encoding = new GZipMessageEncodingBindingElement(useBinaryEncoding 
                   ? (MessageEncodingBindingElement) 
                    new BinaryMessageEncodingBindingElement() 
                   : new TextMessageEncodingBindingElement()); 
     } 
     else 
     { 
      encoding = useBinaryEncoding 
         ? (MessageEncodingBindingElement) new BinaryMessageEncodingBindingElement() 
         : new TextMessageEncodingBindingElement(); 
     } 

     return new BindingElementCollection(new[] 
      { 
       security, 
       encoding, 
       transport, 
      }); 
    } 
} 
0

Trate SecurityBindingElement.CreateUserNameOverTransportBindingElement() lugar:

var custBinding = new CustomBinding(); 
custBinding.Elements.Add(new BinaryMessageEncodingBindingElement()); 
//Transport Security (Not Required) 
if (isHttps) 
{ 
    custBinding.Elements.Add(SecurityBindingElement.CreateUserNameOverTransportBindingElement()); 
} 
//Transport (Required) 
custBinding.Elements.Add(isHttps ? 
    new HttpsTransportBindingElement() : 
    new HttpTransportBindingElement()); 
+0

ya he intentado esto , pero no funciona. Además, cuando isHttps == false no hay configuración de seguridad del mensaje: este es el problema principal. No sé cómo configurar seguridad de mensajes compatible con WSHttpBinding mediante CustomBinding. – Buthrakaur

+0

Por razones de seguridad, WCF solo permite que se envíen combinaciones de nombre de usuario/contraseña cuando la conexión está encriptada, es decir, cuando usa el transporte Https. Esto significa que si no usa Https, no puede proteger sus mensajes de esta manera. Es posible que deba volver a evaluar sus requisitos. –

0

El SecurityBindingElement tiene una propiedad AllowInsecureTransport. Si configura esto como verdadero, puede usar HttpTransportBindingElement con seguridad de nombre de usuario y contraseña.

Cuestiones relacionadas