2012-03-02 99 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