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