WCF服务器故障
本文关键字:故障 服务器 WCF | 更新日期: 2023-09-27 18:18:31
这是我得到的错误:
通信对象;System.ServiceModel.Channels。ServiceChannel,不能用于
我有一个使用WCF的服务试图发送长度为86,284的字符串到另一个服务。两个服务都有这些设置(我使用的是netttcpbinding):
MaxReceivedMessageSize = 100000;
MaxBufferPoolSize = 100000;
MaxBufferSize = 100000;
MaxItemsInObjectGraph = 2147483646
我还有:
IncludeExceptionDetailInFaults = true
我试图用它来获得一些有用的错误信息,但出于某种原因,我得到了同样的东西。这是可能的,我只是不明白如何访问有用的错误消息。我也试过记录服务,但它给出了相同的错误。
我已经深入研究了它,这样当我将这个字符串发送到另一个服务时,我就知道服务出现了故障。我已经确认,它100%的工作时间发送另一个字符串,只有6392个字符长。这就是为什么我认为这些属性可以解决这个问题。如果有人有任何想法或建议,我将不胜感激。
哇,我终于得到一个错误消息:
已超过入站消息的最大消息大小配额(65536)。要增加配额,请使用MaxReceivedMessageSize属性。
我没有正确设置这个属性。我创建了netttcpbinding,然后用这种方式设置属性。不知道为什么不行
编辑:解决了
编辑(问题更改):检查netttcpbinding上的readerquota。这里有一些额外的最大长度
c#使用UTF-16来存储字符串,这意味着一个字符=一个字节。您的86k字符串很可能超过100k字节,这将超出指定的消息大小配额。您可以尝试使用Encoding.GetBytes()来检查字符串的实际字节大小。查看是否超过了集合计数限制。
<serviceBehaviors>
<behavior name="SecureServiceBehavior">
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</serviceBehaviors>
另外,这里有一些关于在iis中增加最大允许请求大小的文档。
通信异常可能是由于使用session导致的。一旦出现异常,您将继续接收错误,直到重新验证或刷新会话。
对于相互通信的两个服务,其中一个托管在另一个windows服务中。我改变了这个其他服务的MaxReceivedMessageSize,它解决了这个问题。它需要在两个windows服务上设置此属性,实际上不需要在另一个托管的一个服务上设置此属性。