Создание пользовательских привязок программно - PullRequest
1 голос
/ 02 марта 2012

Нам нужно сжатие в нашем веб-сервисе WCF, и мы уже нашли хорошее решение:

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 ...

1 Ответ

3 голосов
/ 02 марта 2012

Первый параметр в конструкторе для типа CustomBinding принимает только подкласс BindingElement. Указанный класс является подклассом BindingElementExtensionElement (используется для настройки XML-конфигурации).

Вместо передачи подкласса BindingElementExtensionElement в конструктор CustomBinding необходимо создать подходящий экземпляр подкласса BindingElement (например, BinaryMessageEncodingBindingElement) и вызвать метод BindingElementExtensionElement 'ApplyConfiguration. , проходя в 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
});
...