Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何拦截来自C#客户端Web代理的出站和入站Soap消息_C#_.net_Web Services_Proxy Classes_Soap Client - Fatal编程技术网

如何拦截来自C#客户端Web代理的出站和入站Soap消息

如何拦截来自C#客户端Web代理的出站和入站Soap消息,c#,.net,web-services,proxy-classes,soap-client,C#,.net,Web Services,Proxy Classes,Soap Client,我正在编写UI来测试asmx web服务。服务器和客户端是.NET。客户端代理已使用wsdl.exe生成 我想截取并存储由于在web代理上调用方法而生成的传出和传入SOAP消息的字符串表示形式,以便我可以向UI添加一个功能,该功能将显示刚刚发送/接收的消息 我隐约记得有两对扩展点,可以在其中添加代码以接收消息,但我不记得是如何做到的。我认为我想到的例子涉及到在客户端压缩消息的一部分,在服务器上压缩消息的另一部分,即使在我的场景中,我希望存储而不是更改消息 感谢您的任何提示和帮助 (我已经部分实现

我正在编写UI来测试asmx web服务。服务器和客户端是.NET。客户端代理已使用wsdl.exe生成

我想截取并存储由于在web代理上调用方法而生成的传出和传入SOAP消息的字符串表示形式,以便我可以向UI添加一个功能,该功能将显示刚刚发送/接收的消息

我隐约记得有两对扩展点,可以在其中添加代码以接收消息,但我不记得是如何做到的。我认为我想到的例子涉及到在客户端压缩消息的一部分,在服务器上压缩消息的另一部分,即使在我的场景中,我希望存储而不是更改消息

感谢您的任何提示和帮助


(我已经部分实现了一个soap扩展。我不明白ChainStream方法是如何工作的,我不知道如何通知侦听器soap消息已被捕获(因为我无法控制soap扩展的实例化)。”

我建议两个技巧:

  • 子类化代理并重载方法(有点无聊,但您可以生成类似于此项目中的代码:)
  • 使用异步签名并对每个方法的“已完成”事件进行subcribe(您可以通过反射来实现这一点,以避免写入太多代码)

如果您需要有关这些技巧的更多信息,请告诉我。

您使用SoapExtension的方法是正确的。您看到这里的文档和示例了吗


ChainStream的想法是,您可以通过将要写入请求的网络流,并且可以选择返回另一个流。因此,如果您想保存请求的副本,请返回一个MemoryStream,web服务客户端将把请求写入其中,然后在ProcessMessage调用中,您可以复制数据您最好使用WCF作为客户端技术。然后,您可以简单地使用WCF消息级跟踪来记录传入和传出的消息。这只需通过配置即可完成


没有理由仅仅因为使用ASMX服务就必须使用ASMX客户端。

另一种捕获XML的方法是通过Wireshark应用程序发送的。它会截获通信网卡

在我的例子中,我调用了一个服务,该服务在他的地址中包含字符串PIOSOS

然后找到XML

请看图片

(我知道……这不是一种编程方式,但它有它的价值。哈哈)


谢谢,我的解决方案基于MSDN示例。我创建了一个静态类,封装了一个字典,用于存储出站和入站消息,我的UI随后会读取这些消息。