0

我在 IIS 托管的 WCF 服务上使用 NetMessagingBinding 来使用在 Windows Server 服务总线主题上发布的消息。

据我了解,Windows Server Service Bus 的主题上的消息大小没有限制,但是我在反序列化订阅中的消息时遇到错误:

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.

我看到它的方式没有配置可以在 WCF 的 web.config 中更改以更改最大字符串内容。唯一可能相关的属性是 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>

提前致谢,

若昂·卡洛斯·德索萨

4

3 回答 3

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> 

有关如何使用自定义绑定的更多详细信息,请参阅这篇文章。

于 2013-08-01T10:58:05.243 回答
0

从错误来看,这似乎是 WCF 级别的错误,而不是服务总线。您是否尝试提高 MaxMessageSize?该线程有关于它的信息,但基本上,您需要在 web.config 中的绑定配置上设置类似以下内容:

     <binding name="yourBinding"
             maxReceivedMessageSize="10000000" 
             maxBufferSize="10000000"
             maxBufferPoolSize="10000000">
        <readerQuotas maxDepth="32" 
             maxArrayLength="100000000"
             maxStringContentLength="100000000"/>
    </binding>
于 2013-06-04T20:39:11.553 回答
0

NetMessagingBinding 目前不允许通过 XML 配置更改 MaxStringContentLenght。

一个对我有用的解决方案是通过实现IDispatchMessageFormatter接口来创建消息格式化程序行为扩展。

然后可以通过以下方式使用扩展名:

  • 创建一个可在代码中使用的属性,以识别哪些操作合约将使用消息格式化程序行为

    public class MessageFormatterExtensionBehaviorAttribute : 
       Attribute, IOperationBehavior
    {
    
      (...)
    
    public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
    {
        dispatchOperation.Formatter = new MessageFormatterExtension();
    }
    
    (...)
    
    }
    
  • 创建一个公开自定义行为的配置元素。

于 2013-06-10T09:52:00.457 回答