2009-10-08 6 views
5

Ich stehe hier vor einem Problem. Ich mache ein Client/Server-Projekt, das WCF-Web-Service-Aufruf ist, um Daten zu bekommen. Aufgrund riesiger Daten der Übertragung, ich habe meine Bindung zu benutzerdefinierten Bindung programmgesteuert ändern (nicht durch Config-Datei.)Wie wird eine benutzerdefinierte Bindung erstellt, indem WSHttpBinding-Sicherheit und GZip-Komprimierung verwendet wird?

Ich bin Erstellen einer neuen benutzerdefinierten Bindung als benutzerdefinierte Bindung. Beispiel für die Klasse ist:

public class MyCustomBinding : CustomBinding  

und eine Funktion außer Kraft setzen Binding:

public override BindingElementCollection CreateBindingElements() 
{ 
    WSHttpBinding wSHttpBinding = new WSHttpBinding("RMSKeberosBinding"); //this is to load the configuration from app.config. because i want to copy the setting of wsHttpConfig to my custom binding. 

    BindingElementCollection wSHttpBindingElementCollection = wSHttpBinding.CreateBindingElements(); 

    TransactionFlowBindingElement transactionFlowBindingElement = wSHttpBindingElementCollection.Remove<TransactionFlowBindingElement>(); 
    SymmetricSecurityBindingElement securityElement = wSHttpBindingElementCollection.Remove<SymmetricSecurityBindingElement>(); 
    MessageEncodingBindingElement textElement = wSHttpBindingElementCollection.Remove<MessageEncodingBindingElement>(); 
    HttpTransportBindingElement transportElement = wSHttpBindingElementCollection.Remove<HttpTransportBindingElement>(); 

    GZipMessageEncodingBindingElement gzipElement = new GZipMessageEncodingBindingElement(); // this is from microsoft sample. i want to add gzip as a compress to my message. 

    BindingElementCollection newCol = new BindingElementCollection(); 
    newCol.Add(transactionFlowBindingElement); 
    newCol.Add(securityElement); 
    newCol.Add(gzipElement); 
    newCo .Add(transElement); 
    return newCol; 
} 

, was ich versuche, alle von wsHttpBinding Einstellung zu tun ist, zu kopieren, und auf gzip als Nachrichten Encoder hinzufügen. Komprimierte verschlüsselte Daten führen zu einer größeren Größe der ursprünglichen Daten. Dies liegt daran, dass das SymmetricSecurityBindingElement von WSHttpBinding die Verschlüsselung durchgeführt hat. Wie geht das richtig? Ich möchte die Sicherheitseinstellung von wshttpbinding, und auch das gzip zu arbeiten.

Antwort

0

sollten Sie in der Lage sein, nur ein Verhalten verwenden Kompression entsprechend anzuwenden:

http://weblogs.asp.net/cibrax/archive/2006/03/29/441398.aspx

EDIT: Ich sollte vielleicht auch schließen die Verbindung zum Verhalten basierte Kompression:

http://weblogs.shockbyte.com.ar/rodolfof/archive/2006/04/06/5632.aspx

+0

Hallo, danke für die Antwort. Ich habe mir den Link angesehen, den Sie mir vorher gegeben haben. Entschuldigung, aber ich kann nicht sehen, wo der Ort ist, der dasselbe Verhalten der Sicherheit von WSHttpBinding verwendet? Enthält die Verbindung, die Verschlüsselung enthalten? –

+0

Aus meiner Erfahrung mit dem Code, mit dem ich verlinkt habe, obwohl die gesamte verschlüsselte Nachricht selbst komprimiert wurde, führte dies nicht zu einer größeren Nachrichtengröße, sondern reduzierte stattdessen die Nachrichtengröße. Die Nachricht ist im Kern nur SOAP (d. H. Ausführlicher Text), also sollten Sie durch die Verwendung von Komprimierung Gewinne sehen. Verkenne ich, was du machen willst? – Kwal

+0

Hallo MattK, danke für die Antwort. Für meine Erfahrung darin, wenn ich SymmetricSecurityBindingElement und GZipMessageEncodingBindingElement in die Bindung Element Sammlung hinzufügen (siehe Code oben), die Nachricht wird immer zuerst verschlüsselt, dann weiter mit komprimieren. Ich habe Fiddler benutzt, um die Bandbreitennutzung zu überprüfen. Es ist so riesig, nachdem eine verschlüsselte Nachricht komprimiert wurde. Ich weiß nicht, wie ich das lösen soll. Übrigens, der Link, den Sie mir gesendet haben, können Sie mir zeigen, wo ist der Teil, der die Nachricht verschlüsselt? Ich kann den zu verschlüsselnden Code nicht finden. Dank MattK. –