C# 在调用web服务时,是否有一种简单的方法来获取请求的soap消息和响应的soap消息?

C# 在调用web服务时,是否有一种简单的方法来获取请求的soap消息和响应的soap消息?,c#,xml,wcf,soap,wsdl,C#,Xml,Wcf,Soap,Wsdl,我希望调用一个web服务,并希望将请求和响应对象作为soap消息获取 var response = client.invoke(parameter); 我想以某种方式发送和接收消息。根据Carlos Figueira的MSDN文章,一个选项是使用MessageInspector 创建一个实现and的类。缓冲请求和回复消息,以便以后可以使用它们。在本例中,我在控制台中打印它们 以下是组合实现: //使用System.ServiceModel.Description; //使用System.Ser

我希望调用一个web服务,并希望将请求和响应对象作为soap消息获取

var response = client.invoke(parameter);
我想以某种方式发送和接收消息。

根据Carlos Figueira的MSDN文章,一个选项是使用MessageInspector

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

以下是组合实现:

//使用System.ServiceModel.Description;
//使用System.ServiceModel.Dispatcher;
//使用System.ServiceModel.Channel;
//使用System.ServiceModel
公共类InspectBehavior和Inspector:IEndpointBehavior、IClientMessageInspector
{
public void ApplyClientBehavior(ServiceEndpoint端点、ClientRuntime ClientRuntime)
{
添加(此);
}
公共消息缓冲区请求缓冲区;
公共消息缓冲区ReplyBuffer;
接收后公共无效(参考消息回复,对象关联状态){
//消息是只读的
ReplyBuffer=reply.CreateBufferedCopy(2048);
//因此,在缓冲后重新创建消息
reply=ReplyBuffer.CreateMessage();
}
发送请求前的公共对象(参考消息请求,IClientChannel通道){
//消息是只读的
RequestBuffer=request.CreateBufferedCopy(2048);
//因此,在缓冲后重新创建消息
request=RequestBuffer.CreateMessage();
返回“42”;
}
//客户不需要
公共无效ApplyDispatchBehavior(ServiceEndpoint端点、EndpointDispatcher端点Dispatcher)
{
}
公共无效验证(ServiceEndpoint sep)
{
}
public void AddBindingParameters(ServiceEndpoint sep、BindingParameterCollection bpc)
{
}
}
现在,在您的
客户端
实例上,假设它派生自
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());
我在一个添加服务的示例上运行了此操作,这是我的结果:


http://tempuri.org/ISelfHostTest/Add
3.
2.
5.

是否出于调试原因?使用WireShark之类的软件。不,我需要在我的应用程序中使用它。邮递员工作起来很有魅力,而且它也是免费的。我不是附属机构,我只是在使用它,我是c#dev:也许对你有帮助。@Jabberwocky postman and SOAP?休息时效果很好,但肥皂除外?soapuit如果我实现了服务,这就可以了,但我不实现服务。我只是站在客户端,这就是为什么它很棘手,仍然很有帮助。@Danil.T这是客户端。我尝试过实现它,但它对我不起作用。我得到了一个nullreference异常,即使在复制代码之后。对不起,这是myside上的一个错误,我没有直接在客户端上调用该方法,而是在MethodInfo对象上进行了反射,并且我的检查器没有正确添加到客户端。但是我现在修复了它,你的解决方案运行得很好。你知道为什么我只得到“数据流”作为响应吗?缓冲区大小是否太小?