.Net 4.6服务引用调用失败,带有"最大名称字符计数配额"错误

时间:2016-08-06 00:17:31

标签: asp.net wcf soap

我收到错误消息"读取XML数据时超出了最大名称字符数限额(16384)....第3行,第435位。"在调用商业SOAP Web服务时。但是返回的实际数据不超过任何类型的任何数量 - 它是2k的完全有效的XML,并且在第3行或任何其他行上没有字符435。错误消息毫无意义。

我在stackoverflow上看到了有关此错误消息的其他问题,但它们通常是错误实际上意味着它所说的那种,并且正确的解决方案是提高相关的长度限制。情况并非如此。

背景:多年来,我们的网络应用程序使用商业供应商的网络服务来处理付款。我们用来定义我们接口的WSDL / XSD规范现在有很多版本已经过时,但仍然有效。我们现在正在尝试使用他们当前的WSDL和XSD,以便我们可以利用最近的功能。但是,一旦我从现代布局重新生成服务界面,它就不再起作用了 - 它产生了最大的名字字符数"错误,包含在XML解析异常中。

经过数小时的努力,我设法将IClientMessageInspector类附加到服务,因此我可以记录SOAP请求和响应的内容。您可能会想象当我看到响应不是某种形式错误的服务器错误消息无法解析时,我感到困惑,但是简短而简单的XML响应表明交易成功,就像我们拥有的那样一直在接受。

我最后一个绝望的希望是使用Visual Studio的反汇编调试步骤到抛出错误的地方,并尝试查看实际失败的输入类型,但是,唉,Visual Studio保持不变跳过那段代码 - 即使"自己的代码"它也拒绝透过它。被关闭了。

内部异常的堆栈跟踪读取:

at System.Xml.XmlExceptionHelper.ThrowXmlException(XmlDictionaryReader reader, String res, String arg1, String arg2, String arg3)
at System.Xml.XmlExceptionHelper.ThrowMaxNameTableCharCountExceeded(XmlDictionaryReader reader, Int32 maxNameTableCharCount)
at System.Xml.XmlBaseReader.QuotaNameTable.Add(Int32 charCount)
at System.Xml.XmlBaseReader.QuotaNameTable.Add(String value)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderITransactionProcessor.InitIDs()
at System.Xml.Serialization.XmlSerializationReader.Init(XmlReader r, XmlDeserializationEvents events, String encodingStyle, TempAssembly tempAssembly)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)

这包含在InvalidOperationException中,它表示" XML文档中存在错误(3,436)"有了这条痕迹:

at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.ServiceModel.Dispatcher.XmlSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, XmlSerializer serializer, MessagePartDescription returnPart, MessagePartDescriptionCollection bodyParts, Object[] parameters, Boolean isRequest)

反过来又包含在一个CommunicationException中,说"反序列化回复消息体的错误,操作' xxxx'。"

我不知道如何继续。我无法将错误消息与分析可访问的任何内容相关联。什么可能导致这种情况?

1 个答案:

答案 0 :(得分:1)

在配置中增加客户端的maxNameTableCharCount

<readerQuotas maxDepth="32" 
              maxStringContentLength="5242880" 
              maxArrayLength="16384" 
              maxBytesPerRead="4096"
              maxNameTableCharCount="5242880"/>

读者配额设置仅适用于客户端(或服务) - 基本上是使用该配置的任何一方。

XSD的大小可能是为什么需要增加大小的原因 - MSDN文档并不清楚该属性的作用,所以这是一个半教育的猜测:)