WCF服务客户端:未在网络上发送自定义的soap信封

本文关键字:自定义 信封 soap 网络 客户端 服务 WCF | 更新日期: 2023-09-27 17:59:03

我正在从WCF客户端调用第三方web服务。问题是该服务需要特定的soap信封格式。

WCF Soap Format处理的问题也是如此,建议的解决方案是编写一个CustomTextMessageEncoder。

我已经编写了一个自定义消息编码器,并使用主题中描述的MSDN示例编码器在WriteMessage方法中进行了自定义格式化http://msdn.microsoft.com/en-us/library/ms751486(v=vs.110).aspx.

自定义格式删除了soap标头内容,并添加了一些第三方服务所需的命名空间前缀。

我可以看到VS调试器中正在调用编码器,并且它正在生成所需的输出:

        public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
    {
        // code from MSDN example
        MemoryStream stream = new MemoryStream();
        XmlWriter writer = XmlWriter.Create(stream, this.writerSettings);
        message.WriteMessage(writer);
        writer.Close();
        // My customizing code
        var targetStream = new MemoryStream();
        FormatStreamToMirthFormat(stream, targetStream);
        // code from MSDN example
        // put the contents of the stream into a byte array
        byte[] messageBytes = targetStream.GetBuffer();
        int messageLength = (int)targetStream.Position;
        stream.Close();
        int totalLength = messageLength + messageOffset;
        byte[] totalBytes = bufferManager.TakeBuffer(totalLength);
        Array.Copy(messageBytes, 0, totalBytes, messageOffset, messageLength);
        ArraySegment<byte> byteArray = new ArraySegment<byte>(totalBytes, messageOffset, messageLength);
        return byteArray;
    }

我在app.config中配置了服务消息跟踪,以查看实际发送的内容,但我遇到的问题是,传入的soap信封似乎仍在有线发送(使用basicHttpBinding时发送的信封)。

为什么寄来的是香皂信封,而不是我的定制香皂信封?

我注意到的另一件事是,如果我使用默认绑定"basicHttpBinding",那么连线上的消息包含一个Http标头,后面跟着soap信封:

<HttpRequest xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace">
   <Method>POST</Method>
   <QueryString></QueryString>
   <WebHeaders>
       <VsDebuggerCausalityData>uIDPo+hLJO6ZB9hNt7/+pVZglrYAAAAAus8ogaD9Y0O0ThkjxtbdzBlxO8Yn2yBJggkv3BRx/qsACQAA</VsDebuggerCausalityData>
</WebHeaders>
</HttpRequest>
<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">..

而我的信息是从soap信封开始的。

<s:Envelope xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:s="http://www.w3.org/2003/05/soap-envelope">

谢谢你的帮助。

WCF服务客户端:未在网络上发送自定义的soap信封

MessageEncoder发生在WCF管道的后期,如果需要实现额外的安全要求,您将来可能会遇到问题。我建议使用MessageFormatter。看看这篇文章。

它解释了如何在服务器端执行此操作,但您也可以以类似的方式在客户端执行此操作:重写ApplyClientBehavior而不是ApplyDispatchBehavior,并派生IClientMessageFormatter而不是IDispatchMessageFormatter。