如何访问 SOAP 响应
(如果这里有任何需要澄清/更多细节的地方,请告诉我。)
我有一个使用 SOAP 与第三方 Web 服务交互的应用程序(C#、2.* 框架)。 我针对提供的 WSDL 使用 thinktecture 的 WSCF 插件来创建客户端实现。 由于我无法控制的原因,SOAP 消息交换使用 WSE2.0 来确保安全(必须修改 Thinctecture 实现以包含 WSE2.0 参考)。 除了“正常”数据包之外,我还附加了存储的 X509 证书和先前调用不同 Web 服务的二进制安全令牌。 我们正在使用某种 SSL 加密 - 我不知道细节。
所有必需的序列化/反序列化都包含在 Web 服务客户端中 - 这意味着当调用客户端后将控制权返回给我时,SOAP 响应中包含的整个 XML 字符串对我不可用 - 只能使用反序列化的组件。 不要误会我的意思 - 我认为这很好,因为这意味着我不必自己做。
然而,为了让我有一些值得存储/归档的东西,我必须在根元素处重新序列化数据。 这看起来像是浪费资源,因为我的结果是在 SOAP 响应中。
现在我的问题是: 我如何才能访问 SOAP 响应的“清晰”版本,以便不必重新序列化所有内容以进行存储/归档?
编辑-我的应用程序是作为运行的“无形式”Windows 应用程序网络服务 - 由 WebsphereMQ 客户端触发器监视器触发。 我认为 ASP.NET 解决方案不适用。
编辑 - 由于到目前为止的共识是我的应用程序是否是 ASP.NET 并不重要,那么我将尝试一下 CodeMelt 的(以及 Chris 的)解决方案。
(If anything here needs clarification/ more detail please let me know.)
I have an application (C#, 2.* framework) that interfaces with a third-party webservice using SOAP. I used thinktecture's WSCF add-in against a supplied WSDL to create the client-side implementation. For reasons beyond my control the SOAP message exchange uses WSE2.0 for security (the thinctecture implementation had to be modified to include the WSE2.0 reference). In addition to the 'normal' data package I attach a stored X509 cert and a binary security token from a previous call to a different web service. We are using SSL encryption of some sort - I don't know the details.
All the necessary serialization/deserialization is contained in the web service client - meaning when control is returned to me after calling the client the entire XML string contained in the SOAP response is not available to me - just the deserialized components. Don't get me wrong - I think that's good because it means I don't have to do it myself.
However, in order for me to have something worth storing/archiving I am having to re-serialize the data at the root element. This seems like a waste of resources since my result was in the SOAP response.
Now for my question:
How can I get access to a 'clear' version of the SOAP response so that I don't have to re-serialize everything for storage/archiving?
Edit- My application is a 'formless' windows app running as a network service - triggered by a WebsphereMQ client trigger monitor. I don't think ASP.NET solutions will apply.
Edit - Since the consensus so far is that it doesn't matter whether my app is ASP.NET or not then I will give CodeMelt's (and by extension Chris's) solution a shot.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
您可以利用现有 WSE2.0 框架中的 SoapExtension 来拦截来自服务器的响应。
在SoapMessageStage.BeforeDeserialize阶段,
您可以从oldstream 中读取您想要的预期数据(例如使用XmlReader)。
然后将预期的数据存储在某个地方供自己使用,并且您还需要
将旧流数据转发到新流以供Web服务后期使用该数据,例如将XML反序列化为对象。
记录所有来自 MSDN 的 Web 服务流量
You can utilize SoapExtension from existing WSE2.0 framework to intercept the responses from the server.
At stage of SoapMessageStage.BeforeDeserialize,
You can read the expected data you want from oldstream (e.g. use XmlReader).
Then store the expected data somewhere for yourself to use and also you need
forward the old stream data to the newstream for web service later stage to use the data, e.g. deserialize XML into objects.
The sample of logging all the traffic for the web service from MSDN
下面是一个示例,您可以使用 Visual Studio Web 引用来设置 http://footballpool.dataaccess。 eu/data/info.wso?WSDL
基本上,您必须在 Web 服务调用链中插入一个 XmlReader 间谍程序,它将重建原始 XML。
我相信这种方式比使用 SoapExtensions 更简单。
解决方案的灵感来自 http:// /orbinary.com/blog/2010/01/getting-the-raw-soap-xml-sent-via-soaphttpclientprotocol/
Here is an example you can setup using Visual studio web reference to http://footballpool.dataaccess.eu/data/info.wso?WSDL
Basically, you must insert in the webservice call chain a XmlReader spyer that will reconstruct the raw XML.
I believe this way is somehow simpler that using SoapExtensions.
Solution solution was inspired by http://orbinary.com/blog/2010/01/getting-the-raw-soap-xml-sent-via-soaphttpclientprotocol/
旧线程,但以防其他人今天想要这样做:这些利用 SoapExtension 或创建“间谍”类的想法很棒,但在 .NET Core 中不起作用。
@mting923 使用 IClientMessageInspector 方法的建议适用于 .NET Core 3.1; 请参阅此处:获取 SOAP 消息然后将其发送到 .NET 中的 WebService。
生成的 SOAP 代理类在底层仍然只是一个 WCF 客户端,因此 IClientMessageInspector 方法很有效,即使对于调用旧版 SOAP Web 服务的 .NET Core Azure Function 也是如此。 以下内容在 .NET Core 3.1 Azure 函数中适用于我:
然后可以像这样设置:
在客户端代理上调用 Web 服务调用后,soapInspector.LastRequestXml 和 soapInspector .LastResponseXml 将包含原始 SOAP 请求和响应(作为字符串)。
Old thread, but in case others are looking to do this today: these ideas of leveraging SoapExtension or creating 'spy' classes are great, but don't work in .NET Core.
@mting923's suggestion to use IClientMessageInspector approach works in .NET Core 3.1; see here: Get SOAP Message before sending it to the WebService in .NET.
A generated SOAP proxy class is still just a WCF client under the hood, and so the IClientMessageInspector approach works a treat, even for an .NET Core Azure Function calling an older SOAP web service. The following works for me in a .NET Core 3.1 Azure Function:
And then it can be set up like this:
After invoking a web service call on the client proxy,
soapInspector.LastRequestXml
andsoapInspector.LastResponseXml
will contain the raw SOAP request and response (as strings).受到 jfburdet 的启发,我想看看是否可以直接在流/字节级别进行拦截,而不是重建 XML。 确实如此! 参见下面的代码:
Inspired by jfburdet, I wanted to see if it was possible to directly intercept at stream/byte level rather than reconstructing XML. And it is! See code below:
MSDN 库</ a> 包含用于获取请求和响应的 XML 的示例代码,您可以使用该 XML 将其存档。 显然,您必须进行一些更改,因为该示例将数据存储在文本文件中,但它并不太复杂。
The MSDN Library includes example code for obtaining the XML of both the request and the response that you can use to archive it. Obviously you'll have to make some changes since the example stores data in a text file, but it isn't too complicated.