0

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

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

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

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

文件意外结束。以下元素未闭合:A、B、Body、Envelope。第 28 行,第 9 位。

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

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

这种奇怪行为的原因似乎是在我的自定义绑定中,因为它使用 WebHttpBinding 处理超过 25000 个请求时可以正常工作。

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

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

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

4

1 回答 1

1

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

于 2009-08-14T07:47:24.647 回答