2013-06-04 5 views
0

Я использую NetMessagingBinding в службе WCF службы IIS для использования сообщений, опубликованных в теме службы шины Windows Server.Служебная шина Темы и входящие сообщения

В моем понимании не существует никаких ограничений на размер сообщения на Темы для Bus Service Windows Server, но тем не менее я получаю сообщение об ошибке десериализации сообщение от подписки:

System.ServiceModel.Dispatcher.NetDispatcherFaultException: (...) 
The maximum string content length quota (8192) has been exceeded while reading XML data. 
This quota may be increased by changing the MaxStringContentLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader.'. 
Please see InnerException for more details. ---> System.Runtime.Serialization.SerializationException: There was an error deserializing the object of type [Type]. 
The maximum string content length quota (8192) has been exceeded while reading XML data. This quota may be increased by changing the MaxStringContentLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader. ---> System.Xml.XmlException: 
The maximum string content length quota (8192) has been exceeded while reading XML data. This quota may be increased by changing the MaxStringContentLength property on the XmlDictionaryReaderQuotas object used when creating the XML reader. 

как я вижу его там не является конфигурацией, которую я могу изменить в web.config WCF для изменения максимального содержимого строки. Единственное свойство, которое может быть связано, это MaxBufferPoolSize, но оно не отображается через web.config.

Связывание конфигурации используется:

<bindings> 
    <netMessagingBinding> 
     <binding name="messagingBinding" 
       closeTimeout="00:03:00" openTimeout="00:03:00" 
       receiveTimeout="00:03:00" sendTimeout="00:03:00" 
       prefetchCount="-1" sessionIdleTimeout="00:01:00"> 
     <transportSettings batchFlushInterval="00:00:01" /> 
    </binding> 
    </netMessagingBinding> 
</bindings> 

Спасибо заранее,

Жоао Карлос де Соуза

ответ

1

Эта проблема также может быть решена с использованием пользовательской привязки, которая использует netMessagingTransport. Таким образом, узел readerQuotas может использоваться для определения квот читателя.

<customBinding> 
    <binding name="sbBindingConfiguration" sendTimeout="00:01:00" receiveTimeout="00:01:00" openTimeout="00:01:00"> 
     <binaryMessageEncoding> 
       <readerQuotas maxDepth="100000000" maxStringContentLength="100000000" 
        maxArrayLength="100000000" maxBytesPerRead="100000000" maxNameTableCharCount="100000000"/> 
    </binaryMessageEncoding> 
     <netMessagingTransport manualAddressing="false" maxBufferPoolSize="100000" maxReceivedMessageSize="100000000"> 
     <transportSettings batchFlushInterval="00:00:00"/> 
     </netMessagingTransport> 
    </binding> 
    </customBinding> 

Пожалуйста, обратитесь к этой post для получения более подробной информации о том, как использовать пользовательские привязки.

0

От ошибки, похоже, что это ошибка уровня WCF и Service Bus , Вы пытались поднять MaxMessageSize? This thread есть информация о нем, но в принципе, вам нужно настроить что-то вроде следующего на вашем связывающим свою конфигурацию в web.config:

 <binding name="yourBinding" 
      maxReceivedMessageSize="10000000" 
      maxBufferSize="10000000" 
      maxBufferPoolSize="10000000"> 
     <readerQuotas maxDepth="32" 
      maxArrayLength="100000000" 
      maxStringContentLength="100000000"/> 
    </binding> 
+0

После добавления этих конфигураций я получил ошибки парсера (например, нераспознанный атрибут «maxReceivedMessageSize». Обратите внимание, что имена атрибутов чувствительны к регистру.). Обратите внимание, что я использую «netMessagingBinding». Спасибо Рамиро! – JCS

0

NetMessagingBinding в настоящее время не позволяет изменять MaxStringContentLenght через конфигурации XML.

Решение, которое работало для меня, заключалось в создании расширения поведения форматирования сообщений путем реализации интерфейса IDispatchMessageFormatter.

Расширение может быть использовано либо:

  • создавая атрибут, который может быть использован в коде, чтобы определить, какие операции контрактов будут использовать поведение сообщения форматтер

    public class MessageFormatterExtensionBehaviorAttribute : 
        Attribute, IOperationBehavior 
    { 
    
        (...) 
    
    public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation) 
    { 
        dispatchOperation.Formatter = new MessageFormatterExtension(); 
    } 
    
    (...) 
    
    } 
    
  • создавая configuration element, который предоставляет настраиваемое поведение.

Смежные вопросы