在调用 Web 服务时,是不是有一种简单的方法来获取请求的肥皂消息和响应的肥皂消息?

Posted

技术标签:

【中文标题】在调用 Web 服务时,是不是有一种简单的方法来获取请求的肥皂消息和响应的肥皂消息?【英文标题】:Is there an easy way to get the soap message for the request and the soap message for the response, when invoking the web service?在调用 Web 服务时,是否有一种简单的方法来获取请求的肥皂消息和响应的肥皂消息? 【发布时间】:2019-09-16 01:51:24 【问题描述】:

我想调用一个 Web 服务,并且我想将请求和响应对象作为肥皂消息。

var response = client.invoke(parameter);

我想以某种方式让消息发送和接收。

【问题讨论】:

出于调试原因?使用 WireShark 之类的软件。 不,我的应用程序中需要它。 邮递员的工作就像一个魅力,它也是免费的。我不隶属,我只是在使用它,我是一个 c# 开发人员:getpostman.com 也许this article 对你有帮助。 @Jabberwocky 邮递员和 SOAP?它适用于 REST 但 SOAP? SoapUI 【参考方案1】:

根据 Carlos Figueira 的 MSDN 文章 WCF Extensibility – Message Inspectors,一种选择是使用 MessageInspector。

创建一个实现EndBehavior 和ClientMessageInspector 的类。缓冲请求和回复消息,以便您以后可以使用它们。在本例中,我在控制台中打印它们。

这是组合实现:

// using System.ServiceModel.Description;
// using System.ServiceModel.Dispatcher;
// using System.ServiceModel.Channels;
// using System.ServiceModel
public class InspectBehaviorAndnspector : IEndpointBehavior, IClientMessageInspector


    public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
    
        clientRuntime.MessageInspectors.Add(this);
    

    public MessageBuffer RequestBuffer;
    public MessageBuffer ReplyBuffer;

    public void AfterReceiveReply(ref Message reply, object correlationState)
       // messages are read only
       ReplyBuffer = reply.CreateBufferedCopy(2048);
       // so recreate the message after it was buffered
       reply = ReplyBuffer.CreateMessage();
    

    public object BeforeSendRequest(ref Message request, IClientChannel channel)
       // messages are read only
       RequestBuffer = request.CreateBufferedCopy(2048);
       // so recreate the message after it was buffered
       request = RequestBuffer.CreateMessage();
       return "42";
    

    // not needed for client
    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
    
    

    public void Validate(ServiceEndpoint sep) 
    
    
    public void AddBindingParameters(ServiceEndpoint sep, BindingParameterCollection bpc)
    
    

现在在您的 client 实例上,假设它派生自 ClientBase,您可以这样做:

var inspector = new InspectBehaviorAndnspector();
client.Endpoint.Behaviors.Add(inspector);

// this is your call
var response = client.invoke(parameter);

// either do a ToString
Console.WriteLine(inspector.RequestBuffer.CreateMessage().ToString());
// or Write it with XmlWriter
var sb = new StringBuilder();
using(var xw = XmlWriter.Create(sb, new XmlWriterSettings Indent =true)) 
    inspector.ReplyBuffer.CreateMessage().WriteMessage(xw);

Console.WriteLine(sb.ToString());

我已经在一个带有添加服务的示例上运行了它,这是我的结果:

<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/ISelfHostTest/Add</Action>
  </s:Header>
  <s:Body>
    <Add xmlns="http://tempuri.org/">
      <x>3</x>
      <y>2</y>
    </Add>
  </s:Body>
</s:Envelope>

<?xml version="1.0" encoding="utf-16"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Body>
    <AddResponse xmlns="http://tempuri.org/">
      <AddResult>5</AddResult>
    </AddResponse>
  </s:Body>
</s:Envelope>

【讨论】:

如果我实现了服务就可以了,但我不实现服务。我只是在客户端,这就是为什么它很棘手,仍然很有帮助。 @Danil.T 这客户端。 我已经尝试实现它,但它不适合我。我得到一个空引用异常,即使在复制代码之后也是如此 对不起,这是我这边的一个错误,我不是直接在客户端上调用该方法,而是在一个methondinfo对象上进行反射,并且我的检查器没有正确添加到客户端。但我现在修好了,你的解决方案工作得很好 你知道为什么我只得到“数据流”作为响应吗?缓冲区大小是否过小?

以上是关于在调用 Web 服务时,是不是有一种简单的方法来获取请求的肥皂消息和响应的肥皂消息?的主要内容,如果未能解决你的问题,请参考以下文章

如何从烧瓶中调用另一个 web 服务 api

当您使用 Python 的 Paramiko 库进行 SSH 并从远程机器的 CLI 获取输出时,是不是有一种简单的方法可以消除垃圾值?

当您使用 Python 的 Paramiko 库进行 SSH 并从远程机器的 CLI 获取输出时,是不是有一种简单的方法可以消除垃圾值?

当您使用 Python 的 Paramiko 库进行 SSH 并从远程机器的 CLI 获取输出时,是不是有一种简单的方法可以消除垃圾值?

当您使用 Python 的 Paramiko 库进行 SSH 并从远程机器的 CLI 获取输出时,是不是有一种简单的方法可以消除垃圾值?

如果从某个 html 文件接近,是不是有一种简单的方法可以只执行 if 语句?