2012-08-15 53 views
4

我正在为SOAP服务编写一个WCF客户端,该服务返回带有二进制数据(实际上是PDF文件)的MIME多部分结果。它使用自定义消息编码器。使用WCF自定义解析多部分消息MessageEncoder

如果我将请求作为单部分格式发送,服务似乎并不介意,所以我能够返回结果。我看到的结果有两个问题:

  • 它似乎只返回多部分消息的第一部分。
  • 我找回的数据不能被我的自定义编码器解码。

我曾尝试利用MTOM结合,但食堂的请求。它无法在内容类型中添加“边界”参数,因此服务器无法理解请求。

我想我想要的是一个基本的文本SOAP请求,但一个响应解码MTOM样式。但是,我不知道如何设置它。

我已经发现的最接近的解决方案是这样的:http://blogs.msdn.com/b/carlosfigueira/archive/2011/02/16/using-mtom-in-a-wcf-custom-encoder.aspx

但它似乎是一个非常激进的变化到我的项目。

回答

5

我想通了。首先,当我说我只使用MTOM编码器获得多部分信息的第一部分时,我是不正确的;我得到了整件事情。我正在调试器中查看它,并且底部必须已经在调试查看器中被截断。根据我的经验,手动查看和解密多部分消息。

第二点,我所要做的就是在Content-Type为multipart/related时使用MTOM编码器,并且一切正常。如果您阅读了上面的参考文章,则只需动态检测消息是多部分还是常规文本,然后根据该文本选择合适的编码器。实质上,它是一种自定义编码器,它内置了文本编码器和MTOM编码器,并根据传入消息的内容类型来回切换。

我们的项目在交给主程序逻辑之前需要对响应消息进行一些后处理。因此,我们将传入的SOAP内容作为XML字符串进行处理,并对其进行一些XML操作。

这与本文推荐的解决方案略有不同。本文解决方案中所需的全部内容是使用正确的编码器将消息读入System.ServiceModel.Channels.Message并返回。在我们的解决方案中,我们需要中断这个过程并进行后期处理。

要做到这一点,实现您的自定义编码器执行以下操作:

public override Message ReadMessage(ArraySegment<byte> buffer, BufferManager bufferManager, string contentType) 
{ 
    //First, get the incoming message as a byte array 
    var messageData = new byte[buffer.Count]; 
    Array.Copy(buffer.Array, buffer.Offset, messageData, 0, messageData.Length); 
    bufferManager.ReturnBuffer(buffer.Array); 
    //Now convert it into a string for post-processing. Look at the content-type to determine which encoder to use. 
    string stringResult; 
    if (contentType != null && contentType.Contains("multipart/related")) 
    { 
     Message unprocessedMessageResult = this.mtomEncoder.ReadMessage(buffer, bufferManager, contentType); 
     stringResult = unprocessedMessageResult.ToString(); 
    } 
    else { 
     //If it's not a multi-part message, the byte array already has the complete content, and it simply needs to be converted to a string 
     stringResult = Encoding.UTF8.GetString(messageData); 
    } 
    Message processedMessageResult = functionToDoPostProccessing(stringResult); 
    return processedMessageResult; 
} 
+0

不要忘了,这是确定以纪念自己的答案是正确的 - http://meta.stackexchange.com/questions/ 9933 /存在,-A-约定换受理 - 我 - 自己的回答对我 - 拥有 - 问题 – 2012-08-17 17:22:16