【问题标题】:"Unexpected End of file" using GetReaderAtBodyContents in WCF Service在 WCF 服务中使用 GetReaderAtBodyContents 的“文件意外结束”
【发布时间】:2023-03-23 14:16:02
【问题描述】:

我正在运行一个通过自定义绑定接受 SOAP 消息的 Web 服务。

消息被正确发送,并且大部分都得到了很好的处理。在处理消息时,正在使用以下命令将消息读取到 XmlDocument:

XmlDocument doc = new XmlDocument();
try {
    doc.Load(msg.GetReaderAtBodyContents());
} catch (XmlException x) {
    e = x;
} catch (IOException x) {
    e = x;
}

但是,当服务负载增加时(可能是线程问题?无法想象,因为在我的自定义传输通道使用 WebMessageEncoder 创建消息后,无法在其他任何地方访问消息),尽管输入消息没问题。

文件意外结束。下列的 元素未闭合:A、B、Body、 信封。第 28 行,位置 9。

由于我在这一行的代码中放置了一个断点,我可以查看 msg.ToString() 的当前值,它为我提供了一个 XML 文件,该文件在 http://www.validome.org/xml/validate/ 这样的验证器中验证良好

请注意,调用 msg.ToString() 并不总是必须正常工作,因为主体也可能是流形式,只能在 msg.GetReaderAtBodyContents() 处使用阅读器读取一次。

这种奇怪行为的原因似乎在于我的自定义绑定,因为它在使用 WebHttpBinding 处理超过 25000 个请求时运行良好。

在我的传输通道中,我在将消息从输入源提取到 byte[] 正文后使用此代码。

Message message = encoder.ReadMessage(
new ArraySegment<byte>(body, 0, contentLength), bufferManager, contentType);

之后会应用标头,然后将消息直接放入 RequestContext 的 RequestMessage 属性中。错误中一定有我忘记的东西。但是什么?

【问题讨论】:

    标签: xml wcf wcf-binding


    【解决方案1】:

    问题是,我调用了 encoder.ReadMessage 两次,有一条消息用于调试输出,一条消息传递给 RequestContext。不幸的是,ReadMessage 将 byte[] 缓冲区返回到池中。如果负载增加,另一个线程可以获取两个 ReadMessage 调用之间的缓冲区并用自己的东西覆盖它。由于第二条消息已转发到 ServiceModel,因此它可能已通过此过程损坏。

    【讨论】:

      猜你喜欢
      • 2011-10-09
      • 2019-04-18
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 2016-12-11
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      相关资源
      最近更新 更多