【发布时间】:2020-04-20 16:23:31
【问题描述】:
我正在使用 .NET 中的 WCF 客户端调用 SOAP 服务。 有时,SOAP 服务会发回无法序列化到 .NET 对象的响应。这里的罪魁祸首是一个日期时间字段,他们在其中发回“24:00:00”而不是“00:00:00”。
在这种情况下,我们会返回以下错误:“日历 System.Globalization.GregorianCalendar 不支持字符串表示的 DateTime。”
为了解决这个问题,我实现了一个 WCF 消息检查器,我想在“AfterReceiveReply”方法中修改消息。在这里我想找出错误的日期并更正它,然后再发回给客户。
我会通过字符串操作(查找+替换)来进行替换。
但是,我无法将回复消息的内容作为字符串检索.. 我尝试通过“reply.GetReaderAtBodyContents()”执行此操作,然后获取“OuterXml”,但这最终会因与上述相同的错误而崩溃,因为它将它作为 XML 对象读取(并且它包含无效的日期)。
我也尝试了以下操作,但我也遇到了同样的问题(因为我们无法将无效的 XML 写入 XmlWrite 对象),它会引发与上述相同的错误。
MemoryStream ms = new MemoryStream();
XmlWriter xw = XmlWriter.Create(ms);
reply.WriteMessage(xw);
xw.Flush();
string body = Encoding.UTF8.GetString(ms.ToArray());
xw.Close();
Message 对象只接受“XmlWriter”或“XmlDictionaryWriter”来写入不同的流:
任何想法如何将回复消息的原始正文内容作为字符串对象获取,而不将其解析为 XML 文档?
提前致谢!
最好的问候
【问题讨论】:
-
也许不是使用 XmlWriter,而是使用字符串编写器并以这种方式更正内容?我认为任何形式的 XML 解析器都会在验证时失败,你必须在解析之前修复它。只是我的 2 美分
-
感谢您的评论。确实,但我无法将流写入字符串写入器。消息对象只接受一个 XmlWriter 对象。所以我想找到一种使用 StringWriter 而不是 XmlWriter 的方法(我用这个信息更新了我的问题)
-
XML 本身不了解“类型”。它不应该知道一个元素代表一个日期,除非你给它一个 XML Schema。当您执行 GetReaderAtBodyContents 时崩溃时,您可以共享堆栈跟踪吗?
-
消息需要被视为不可变的。您需要使用
Message.CreateMessage重载之一创建一个新消息,并将其分配给reply(这就是为什么reply是ref) -
我在最初的问题中添加了错误详细信息。使用“GetReaderAtBodyContents”并调用“ReadOuterXml”函数时,会引发日期时间异常。我尝试使用其他可用方法之一,例如“reader.ReadContentAsString()”,但这只会返回一个空字符串。