2010-02-10 8 views
5

erstellen Ich möchte meine aktuellen HTTP/HTTPS WCF Bindungseinstellungen zu binäre Nachrichtencodierung konvertieren, und ich muss es in Code tun - nicht in XML Aufbau. AFAIK ist es notwendig, ein CustomBinding-Objekt zu erstellen und geeignete BindingElements zu setzen, aber ich kann nicht herausfinden, welche Elemente ich in meinem Szenario verwenden soll.WCF - wie programmatisch benutzerdefinierte Bindung mit Binärcodierung über HTTP (S)

Hauptpunkte in meiner WCF-Konfiguration sind:

  • Verwendung HTTP- oder HTTPS-Verkehr je nach Konfiguration (in app.config)
  • Verwendung Benutzername Nachrichtensicherheit
  • todo: statt Standard binäre Codierung hinzufügen Text

Mein aktueller Code für die Bindung oben (Arbeits, aber ohne die binäre Codierung) Einstellung:

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

ich diesen Code versuchte, aber es funktioniert nicht - ich weiß nicht, wie für Benutzernamen Nachrichtensicherheit Nachricht Sicherheitselement setzen:

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()); 

Wer weiß, wie dies einzurichten? Ich habe versucht, für ähnliches Problem/Lösung zu suchen, aber nicht gelungen ...

Antwort

7

ich diese Frage fast vergessen, aber hier ist meine benutzerdefinierte Bindung Klasse, die mit binärer Bindung über HTTP mit Benutzername + Kennwortüberprüfung funktioniert und ermöglicht auch auf GZIP-Komprimierung zu aktivieren ...

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

SecurityBindingElement.CreateUserNameOverTransportBindingElement() Versuchen Sie stattdessen:

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

ich dies bereits versucht, , aber es funktioniert nicht. Auch wenn isHttps == false gibt es keine Nachrichtensicherheit Setup - das ist das Hauptproblem. Ich weiß nicht, wie WSHttpBinding-kompatible Nachrichtensicherheit mit CustomBinding eingerichtet wird. – Buthrakaur

+0

Aus Sicherheitsgründen lässt WCF nur zu, dass Benutzername/Passwort-Kombinationen gesendet werden, wenn die Verbindung verschlüsselt ist - dh wenn Sie den HTTP-Transport verwenden. Dies bedeutet, dass Sie Ihre Nachrichten nicht auf diese Weise sichern können, wenn Sie keine HTTPS verwenden. Möglicherweise müssen Sie Ihre Anforderungen neu bewerten. –

0

Die Security hat eine AllowInsecureTransport Eigenschaft. Wenn Sie dies auf "True" setzen, können Sie das HttpTransportBindingElement mit dem Benutzernamen und dem Kennwortsicherheitskennwort verwenden.

Verwandte Themen