在客户端拦截来自和去往Web服务的SOAP消息

我有一个与 web 服务通信的客户端。我与之通信的类是通过 wsdl.exe 生成的 C# 类。我现在想记录所有传入和传出消息。

我有一个与 web 服务通信的客户端。我与之通信的类是通过 wsdl.exe 生成的 C# 类。我现在想记录所有传入和传出消息。

到目前为止,我所做的是编写一个从自动生成的 C # Class 继承的类,并且我已经重写了 GetReaderForMessage 方法。这样我可以或多或少地访问传入的消息:

protected override XmlReader GetReaderForMessage(SoapMessage message, int bufferSize)
{
    System.Xml.XmlReader aReader = base.GetReaderForMessage(message, bufferSize);
    System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
    doc.Load(aReader);
    string content = doc.InnerXml.ToString();
    System.Xml.XmlReader aReader2 = System.Xml.XmlReader.Create(new System.IO.StringReader(content));
    return aReader2;
}

显然我对这个解决方案不太满意,因为基本上我正在创建两个 xml 阅读器。一个读取 SOAP 消息的内容,一个返回到方法调用方。加上我真的不能对 GetWriterForMessage 方法做同样的事情。

我已经阅读了一些文章,建议我应该在这里使用 SoapExtensions,但从我可以理解的是,只有当我创建的“客户端”本身是一个 Web 服务,在这种情况下它不是。

有什么建议吗?

60

您需要使用“添加服务引用”而不是“添加 Web 引用”功能来使用此解决方案,如果服务是 ASMX 或 WCF,则可以使用它。(您需要使用.NET Framework 3.X 来使用此功能)

This article将帮助您将服务引用添加到 C# 项目中。

要截取请求和响应的 XML,请实现这两个类:

public class InspectorBehavior : IEndpointBehavior
{
    public string LastRequestXML { 
        get
        {
            return myMessageInspector.LastRequestXML;
        }
    }
    public string LastResponseXML { 
        get
        {
            return myMessageInspector.LastResponseXML;
        }
    }
    private MyMessageInspector myMessageInspector = new MyMessageInspector();
    public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
    {
    }
    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    {
    }
    public void Validate(ServiceEndpoint endpoint)
    {
    }
    public void ApplyBehavior(ServiceEndpoint endpoint, Runtime clientRuntime)
    {
        clientRuntime.MessageInspectors.Add(myMessageInspector );
    }
}
public class MyMessageInspector : IMessageInspector
{
    public string LastRequestXML { get; private set; }
    public string LastResponseXML { get; private set; }
    public void AfterReceiveReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
    {
        LastResponseXML = reply.ToString();
    }
    public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IChannel channel)
    {
        LastRequestXML = request.ToString();
        return request;
    }
}

然后,将调用代码更改为:

MyTestServiceSoap client = new MyTestServiceSoap();
var requestInterceptor = new InspectorBehavior();
client.Endpoint.Behaviors.Add(requestInterceptor );
client.DoSomething("param1", "param2", "param3");
string requestXML = requestInterceptor.LastRequestXML;
string responseXML = requestInterceptor.LastResponseXML;

* * * * EDIT * * * * 这与服务器端技术无关,您可以将其与 WCF,ASMX,PHP,...Web 服务一起使用,我已经在:http://www.w3schools.com/webservices/tempconvert.asmx上进行了测试

并得到了以下 XML:

requestXML =

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Header>
    <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://tempuri.org/CelsiusToFahrenheit</Action>
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <CelsiusToFahrenheit xmlns="http://tempuri.org/">
      <Celsius>50</Celsius>
    </CelsiusToFahrenheit>
  </s:Body>
</s:Envelope>

responseXML =

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <s:Header xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" />
  <soap:Body>
    <CelsiusToFahrenheitResponse xmlns="http://tempuri.org/">
      <CelsiusToFahrenheitResult>122</CelsiusToFahrenheitResult>
    </CelsiusToFahrenheitResponse>
  </soap:Body>
</soap:Envelope>

* * * * 编辑 2 * * * *

“添加 Web 引用”不是专门针对 ASMX 的,也不是 ASMX 客户端技术,“添加服务引用”也不是 WCF 客户端技术,您可以使用两者来添加对 ASMX,WCF,JSP 开发或 PHP 开发的 Web 服务的引用,您需要您的应用程序使用.Net 框架 3.5 来使用“添加服务引用”。

This article提到:

在 Visual Studio 中使用“添加 Web 引用”对话框时,将使用 WSDL 信息生成客户端并将其添加到 Visual Studio 项目中。这通常用于 ASMX 服务,但您也可以使用“添加 Web 引用”对话框为 WCF 服务创建客户端。但是,您需要手动键入服务 URL,并且生成的使用 XML 序列化程序.exe,这是您支持的唯一序列化类型的 WCF 服务。

本站系公益性非盈利分享网址,本文来自用户投稿,不代表码文网立场,如若转载,请注明出处

(648)
从终端GET工作 但httr::GET不
上一篇
将“page-break-before”应用于表行 (tr)
下一篇

相关推荐

  • websql数据库:如何利用WebSQL数据库提升网站性能

    Web SQL Database 是一种基于浏览器的关系数据库,用于在客户端存储和检索数据。它是一种基于SQL的API,可以使开发人员使用标准的SQL语句来创建、检索、更新和删除数据库中的数据。…

    2023-06-30 12:19:41
    0 91 64
  • webstorm怎么debug:如何使用WebStorm进行Debugging

    示例示例在中打开要调试的项目,点击“Run”菜单,选择“Edit ”,然后点击“+”号,选择“ Debug”,在新窗口中输入项目名称,然后点击“OK”。然后,在代码中添加断点,可以使用快捷键Ctrl + F8来添加断点,也可以在行号上单击鼠标右键,然后选择“Toggle ”来添加断点。…

    2024-01-27 02:21:46
    0 79 28
  • webstorm vue环境搭建:## 使用Webstorm搭建Vue开发环境

    Vue环境搭建:安装Node.js:我们需要安装Node.js,因为Vue是基于Node.js的,所以必须要安装Node.js。…

    2023-06-22 10:04:28
    0 34 27
  • webp转成gif(含代码示例)

    WebP转换成GIF的方法有很多种,下面介绍一种使用Python Image LibraryPIL)库的方法。安装PIL库:…

    2023-07-21 14:02:38
    0 68 85
  • 个人简历web:如何使用web3的个人扩展签署个人消息

    关于个人简历web的问题,在ios web3中经常遇到,我正在用 matter inc 制作一个带有 web3swift 的 Dapp。我遇到的一种方法是 web3.Personal 扩展之一:…

    2022-11-27 10:31:08
    0 15 12
  • Web学生成绩管理系统:SQL-根据年级类型计算加权学生成绩

    关于Web学生成绩管理系统的问题,在grade weighted calculator中经常遇到,我无法根据特定的年级类型计算学生成绩。…

    2022-11-28 12:25:11
    0 68 83
  • Web项目学习:学习 R的好书、网络资源和项目有哪些

    关于Web项目学习的问题,在best r books中经常遇到,我有一本名为《计算机科学家统计学》的书以及我的工程统计学教科书,因此我正在考虑使用其中的各种问题和示例来学习 R,这可能是一个好的开始。但是有人可以推荐有关 R 的信息的书籍和网站,尤其是如果它们是为具有统计学知识的人设计的吗?作为一名学习软件工程的大学生,是否有任何大中型项目或现实世界的情况可以让我使用 R 来感受一下?…

    2022-12-14 16:05:55
    0 24 77
  • 搭建nas服务器:家庭服务器、 NAS、隐私和 Web托管

    关于搭建nas服务器的问题,在personal cloud home server中经常遇到,新的这里,一切与家庭服务器有关,但我有一个问题,我希望我能得到一些帮助。…

    2022-11-27 03:21:43
    0 68 32

发表评论

登录 后才能评论

评论列表(76条)