2012-03-02 98 views
1

我們需要在我們的WCF Web服務的壓縮和已經找到了一個很好的解決方案:創建自定義綁定程序

http://www.codeproject.com/Articles/53718/Extending-WCF-Part-II

這裏只有一個問題。配置文件是沒有選擇的。這些自定義綁定如何在代碼中創建?

<customBinding> 
    <binding name="ZipBinding" closeTimeout="00:10:00" 
openTimeout="00:10:00" receiveTimeout="00:10:00" 
    sendTimeout="00:10:00"> 
     <customMessageEncoding innerMessageEncoding="mtomMessageEncoding" 
    messageEncoderType="YourAssemblyName.YourMessageEncoder, 
    WcfExtensions"> 
     <readerQuotas maxDepth="999999999" 
      maxStringContentLength="999999999" 
    maxArrayLength="999999999" maxBytesPerRead="999999999" 
    maxNameTableCharCount="999999999"> 
     </readerQuotas> 
     </customMessageEncoding> 
     <httpTransport maxBufferSize="999999999" 
     maxReceivedMessageSize="999999999" 
    authenticationScheme="Anonymous" 
    proxyAuthenticationScheme="Anonymous" useDefaultWebProxy="true"/> 
    </binding> 
    </customBinding> 

這是我想出來的:

MessageEncodingBindingElementExtension customMessageEncoding = new MessageEncodingBindingElementExtension 
{ 
    InnerMessageEncoding = "binaryMessageEncoding", 
    MessageEncoderType = "WcfExtensions.GZipMessageEncoder, WcfExtensions", 
}; 
customMessageEncoding.ReaderQuotas.MaxDepth = 999999999; 
customMessageEncoding.ReaderQuotas.MaxStringContentLength = 999999999; 
customMessageEncoding.ReaderQuotas.MaxArrayLength = 999999999; 
customMessageEncoding.ReaderQuotas.MaxBytesPerRead = 999999999; 
customMessageEncoding.ReaderQuotas.MaxNameTableCharCount = 999999999; 

CustomBinding zipBinding = new CustomBinding(customMessageEncoding, new HttpTransportBindingElement 
{ 
    MaxBufferSize = 999999999, 
    MaxReceivedMessageSize = 999999999, 
    AuthenticationScheme = System.Net.AuthenticationSchemes.Anonymous, 
    ProxyAuthenticationScheme = System.Net.AuthenticationSchemes.Anonymous, 
    UseDefaultWebProxy = true 
}); 

zipBinding.CloseTimeout = new TimeSpan(0, 10, 0); 
zipBinding.OpenTimeout = new TimeSpan(0, 10, 0); 
zipBinding.ReceiveTimeout = new TimeSpan(0, 10, 0); 
zipBinding.SendTimeout = new TimeSpan(0, 10, 0); 

但出於某種原因CustomBinding不接受customMessageEncoding ...

回答

3

在構造函數的第一個參數的類型CustomBinding僅接受BindingElement子類。您指定的類是BindingElementExtensionElement子類(用於自定義配置Xml)。

相反使BindingElementExtensionElement的子類進CustomBinding構造的,應該創建的BindingElement(例如BinaryMessageEncodingBindingElement)的合適的子類的實例,並調用BindingElementExtensionElementApplyConfiguration方法,傳入BindingElement

然後將BindingElement的實例傳遞給CustomBinding構造函數。

BinaryMessageEncodingBindingElement encodingElement = new BinaryMessageEncodingBindingElement(); 
customMessageEncoding.ApplyConfiguration(encodingElement); 

CustomBinding zipBinding = new CustomBinding(encodingElement, new HttpTransportBindingElement 
{ 
    MaxBufferSize = 999999999, 
    MaxReceivedMessageSize = 999999999, 
    AuthenticationScheme = System.Net.AuthenticationSchemes.Anonymous, 
    ProxyAuthenticationScheme = System.Net.AuthenticationSchemes.Anonymous, 
    UseDefaultWebProxy = true 
}); 
+0

謝謝!這工作。 – Juha 2012-03-06 11:48:32