gpt4 book ai didi

c# - WCF 请求体有时是一个流,有时是缓冲的?

转载 作者:行者123 更新时间:2023-11-30 12:15:17 25 4
gpt4 key购买 nike

我有一个 WCF 网络服务。我正在尝试通过实现 MessageInspector 并记录 AfterReceiveRequest() 事件来在收到请求时进行一些记录。

出于某种原因,每当我使用 WCFTestClient.exe 向网络服务发送请求时,一切正常。消息被记录并且请求照常进行。

但是当我使用 SOAPUI 作为客户端向 web 服务发送请求时,制作请求消息的副本会导致正文仅显示 <body>... stream ...</body>并且稍后为了验证而无法将其作为 XML 文档加载。

我猜测来自 WCFTestClient.exe 的请求是通过缓冲的消息正文接收的,而来自 SOAPUI 的请求是作为流式正文接收的?这怎么可能?

  • 有没有什么方法可以让我编写一些代码来安全地复制任一版本?我还没有弄清楚如何安全地复制流式版本,因为 CreateBufferedCopy() 显然无法实现这一点。

  • 或者我可以将 WCF 配置为始终创建缓冲的消息正文而不创建流吗?

这是我用来记录和复制请求消息的代码:

object IDispatchMessageInspector.AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
{
try
{

MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue);
request = buffer.CreateMessage();

Message copy = buffer.CreateMessage();

LogRequest(copy);

ValidateMessage(ref request);
}
catch (Exception e)
{
throw new FaultException<>()...
}
return null;
}

如果请求消息的副本来自带有流式正文的 SOAPUI,则无法在 ValidateMessage() 方法中将其加载到 XML 文档中。如果它来自带有缓冲主体的 WCFTestClient.exe,则成功作为 XML 文档加载。

void validateMessage(ref System.ServiceModel.Channels.Message message)
{
XmlDocument bodyDoc = new XmlDocument();
//This load throws exception if request came from SOAPUI with streamed body...
bodyDoc.Load(message.GetReaderAtBodyContents());
...
}

Load()方法抛出的异常是:

System.InvalidOperationException {"The specified node cannot be inserted as the valid child of this node, because the specified node is the wrong type."}

at System.Xml.XmlDocument.AppendChildForLoad(XmlNode newChild, XmlDocument doc) at System.Xml.XmlLoader.LoadDocSequence(XmlDocument parentDoc) at System.Xml.XmlLoader.Load(XmlDocument doc, XmlReader reader, Boolean preserveWhitespace) at System.Xml.XmlDocument.Load(XmlReader reader) at ...

最佳答案

我相信 SOAPUI 总是将它构建的消息请求发送为 Stream。我不确定您是否可以通过 SOAPUI 测试中的代码或 SOAPUI 上的某些 SOAPUI 配置选项/文件修改此内容。

按照说明检查绑定(bind)的 TransferMode 属性 herehere .您可能有多个端点,为向您发送缓冲请求和 stremed 请求的客户端使用不同的自定义绑定(bind)。

希望这对您有所帮助。

关于c# - WCF 请求体有时是一个流,有时是缓冲的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7706944/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com