C# WCF通信上的消息过大

C# WCF通信上的消息过大,c#,wcf,nettcpbinding,C#,Wcf,Nettcpbinding,我有一个windows服务和一个winform应用程序,它们通过TCP使用WCF相互通信 有时我不得不交换大量数据,在客户端遇到了通信异常。现在我很难找到要更改的属性和位置(在服务器端还是客户端?) 当服务器向客户端返回的值是两个双元组数组的2-uple(我自己的实现)时,就会出现问题:Tuple(两个数组的长度始终相同)。 我注意到当数组的长度为22000时没有错误,但是当数组的长度为44000时会抛出CommunicationException 这是我的App.config文件,关于netT

我有一个windows服务和一个winform应用程序,它们通过TCP使用WCF相互通信

有时我不得不交换大量数据,在客户端遇到了
通信异常。现在我很难找到要更改的属性和位置(在服务器端还是客户端?)

当服务器向客户端返回的值是两个双元组数组的
2-uple
(我自己的实现)时,就会出现问题:
Tuple
(两个数组的长度始终相同)。
我注意到当数组的长度为
22000
时没有错误,但是当数组的长度为
44000
时会抛出
CommunicationException

这是我的
App.config
文件,关于
netTcpBinding
部分:

  • 在服务器上:

同样的
服务行为

<behaviors>
    <serviceBehaviors>
        <behavior name="Debug">
            <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
        </behavior>
    </serviceBehaviors>
</behaviors>

然后,我在客户端收到一个
NetDispatcherFaultException
,建议我增加
maxArrayLength
maxItemsInObjectGraph
。但对我来说,这些值已经在很大程度上设置为我需要传输的内容,并且也设置为最大值

下面是
InnerException
消息:

读取XML数据时已超过最大数组长度配额(19502)或对象图配额中的最大项。可以通过更改XmlDictionaryReaderQuotas上的MaxArrayLength属性或MaxItemsInObjectGraph设置来增加这些配额


有线索吗?这个
19502
数字从何而来?

我个人会增加
MaxReceivedMessageSize
,确保
maxBufferSize
也被调整。这些是我们需要调整的共同领域

我个人会增加
MaxReceivedMessageSize
,确保
maxBufferSize
也得到调整。这些是我们需要调整的共同领域

如果要在服务器和客户端之间交换大量数据,则必须在两者上配置绑定的属性。例如:

<binding name="LargeSettings" maxBufferSize="20000000" maxBufferPoolSize="20000000" maxReceivedMessageSize="20000000" closeTimeout="01:00:00" openTimeout="01:00:00" receiveTimeout="01:00:00" sendTimeout="01:00:00">
      <readerQuotas maxDepth="32" maxStringContentLength="200000000" maxArrayLength="200000000" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None" />
    </binding>

从大的价值中找出适合你的价值

编辑:

在客户端,您需要配置行为,并在客户端端点中设置该行为。大概是这样的:

<system.serviceModel>
    <behaviors>
        <endpointBehaviors>
            <behavior name="debug"> <dataContractSerializer maxItemsInObjectGraph="2147483647" />
            </behavior>
        </endpointBehaviors>
    </behaviors>

然后在客户端端点中设置行为:

<endpoint name="myEndpoint" behaviorConfiguration="debug">
    Your other settings...
</endpoint>

您的其他设置。。。

希望这能有所帮助。

在服务器和客户端上,如果要在它们之间交换大量数据,则必须配置绑定的属性。例如:

<binding name="LargeSettings" maxBufferSize="20000000" maxBufferPoolSize="20000000" maxReceivedMessageSize="20000000" closeTimeout="01:00:00" openTimeout="01:00:00" receiveTimeout="01:00:00" sendTimeout="01:00:00">
      <readerQuotas maxDepth="32" maxStringContentLength="200000000" maxArrayLength="200000000" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None" />
    </binding>

从大的价值中找出适合你的价值

编辑:

在客户端,您需要配置行为,并在客户端端点中设置该行为。大概是这样的:

<system.serviceModel>
    <behaviors>
        <endpointBehaviors>
            <behavior name="debug"> <dataContractSerializer maxItemsInObjectGraph="2147483647" />
            </behavior>
        </endpointBehaviors>
    </behaviors>

然后在客户端端点中设置行为:

<endpoint name="myEndpoint" behaviorConfiguration="debug">
    Your other settings...
</endpoint>

您的其他设置。。。

希望这能有所帮助。

这是一个wsHttpBinding的副本,我曾在测试中使用它成功地传输了大量数据。我并不是说这些值是最佳实践,但它们可以传递大量数据

    <binding name="WSHttpBinding_LargeData" 
      maxBufferPoolSize="524288" 
      maxReceivedMessageSize="99999999">

      <readerQuotas 
         maxDepth="128" 
         maxStringContentLength="8192" 
         maxArrayLength="163840000" 
         maxBytesPerRead="4096" 
         maxNameTableCharCount="16384"
      />
    </binding>

这是一个wsHttpBinding的副本,我在测试中使用它成功地传输了大量数据。我并不是说这些值是最佳实践,但它们可以传递大量数据

    <binding name="WSHttpBinding_LargeData" 
      maxBufferPoolSize="524288" 
      maxReceivedMessageSize="99999999">

      <readerQuotas 
         maxDepth="128" 
         maxStringContentLength="8192" 
         maxArrayLength="163840000" 
         maxBytesPerRead="4096" 
         maxNameTableCharCount="16384"
      />
    </binding>

您是否在服务行为中尝试了maxItemsInObjectGraph

 <dataContractSerializer maxItemsInObjectGraph="2147483647"/>

您是否在服务行为中尝试了maxItemsInObjectGraph

 <dataContractSerializer maxItemsInObjectGraph="2147483647"/>


您在客户端和服务器端都有设置吗?@ChrisNel52:I在客户端和服务器端都更新了Q。@Otiel-您是否使用bindingConfiguration属性引用您在端点中配置的绑定?如果没有,您将获得绑定的默认值,而不是您设置和期望的值。@Tim:是的,我是:
@Otiel这又是一个悬而未决的问题吗?有赏金?如果是,您现在的新问题是什么:)客户端和服务器端都有设置吗?@ChrisNel52:I更新了客户端和服务器端的Q。@Otiel-是否使用bindingConfiguration属性引用您在端点中配置的绑定?如果没有,您将获得绑定的默认值,而不是您设置和期望的值。@Tim:是的,我是:
@Otiel这又是一个悬而未决的问题吗?有赏金?如果是,您现在的新问题是什么:)您能发布完整的异常详细信息吗?也许我们遗漏了什么。我用新的错误更新了我的问题。请参阅我的编辑。您确定您的绑定在服务器和客户端上都正确映射了吗?您的服务标签是否引用该行为?喜欢吗?是的。虽然我的服务器上只有
配置,客户端上只有
配置。但我不确定这是否对您有帮助。在客户端,您需要配置行为,并在客户端端点中设置该行为。如下所示:您在客户端端点中设置行为:您的其他设置。你能把例外情况的详细情况全部公布吗?也许我们遗漏了什么。我用新的错误更新了我的问题。请参阅我的编辑。您确定您的绑定在服务器和客户端上都正确映射了吗?您的服务标签是否引用该行为?喜欢吗?是的。虽然我的服务器上只有
配置,客户端上只有
配置。但我不确定这是否对您有帮助。在客户端,您需要配置行为,并在客户端端点中设置该行为。Som