gpt4 book ai didi

c# - 如何访问 SOAP 响应

转载 作者:可可西里 更新时间:2023-11-01 08:40:11 26 4
gpt4 key购买 nike

(如果这里有任何需要澄清/更多细节,请告诉我。)

我有一个应用程序(C#,2.* 框架)使用 SOAP 与第三方网络服务交互。我针对提供的 WSDL 使用了 thinktecture 的 WSCF 插件来创建客户端实现。出于我无法控制的原因,SOAP 消息交换使用 WSE2.0 来确保安全(必须修改 thinctecture 实现以包含 WSE2.0 引用)。除了“正常”数据包之外,我还附加了一个存储的 X509 证书和一个来自先前对不同 Web 服务的调用的二进制安全 token 。我们正在使用某种 SSL 加密——我不知道细节。

所有必要的序列化/反序列化都包含在 Web 服务客户端中 - 这意味着当调用客户端后控制返回给我时,SOAP 响应中包含的整个 XML 字符串对我不可用 - 只有反序列化的组件。不要误会我的意思 - 我认为这很好,因为这意味着我不必自己做。

但是,为了让我拥有值得存储/存档的东西,我必须在根元素处重新序列化数据。这似乎是一种资源浪费,因为我的结果是在 SOAP 响应中。

现在我的问题是: 我如何才能访问 SOAP 响应的“清晰”版本,以便我不必重新序列化所有内容以进行存储/存档?

编辑 - 我的应用程序是作为网络服务运行的“无形式”Windows 应用程序 - 由 WebsphereMQ 客户端触发器监视器触发。我认为 ASP.NET 解决方案不适用。

编辑 - 由于目前的共识是我的应用程序是否是 ASP.NET 并不重要,那么我将试一试 CodeMelt 的(以及扩展 Chris 的)解决方案。

最佳答案

您可以利用现有 WSE2.0 框架中的 SoapExtension 来拦截来自服务器的响应。

public class MyClientSOAPExtension : SoapExtension
{

Stream oldStream;
Stream newStream;

// Save the Stream representing the SOAP request or SOAP response into
// a local memory buffer.
public override Stream ChainStream( Stream stream )
{
oldStream = stream;
newStream = new MemoryStream();
return newStream;
}

public override void ProcessMessage(SoapMessage message)
{
switch (message.Stage)
{
case SoapMessageStage.BeforeDeserialize:
// before the XML deserialized into object.
break;
case SoapMessageStage.AfterDeserialize:
break;
case SoapMessageStage.BeforeSerialize:
break;
case SoapMessageStage.AfterSerialize:
break;
default:
throw new Exception("Invalid stage...");
}
}
}

在SoapMessageStage.BeforeDeserialize阶段,您可以从 oldstream 中读取您想要的预期数据(例如使用 XmlReader)。然后将预期的数据存储在某个地方供您自己使用,并且您还需要将旧的流数据转发到 newstream 供 web 服务后期使用数据,例如将 XML 反序列化为对象。

The sample of logging all the traffic for the web service from MSDN

关于c# - 如何访问 SOAP 响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/256234/

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