带有主体和标头符号的BizTalk WCF-WebHTTP REST客户端,带有静态端口

问题描述

我需要将REST客户端编写为需要自定义标头和JSON主体的服务(简称为REST SERVICE)。

其中两个标头必须具有根据标头(也是动态的)和整个JSON主体中的其他值计算的签名。

我还托管了将用于为我的客户提供服务的Web服务。服务主体中有一些值需要传递给REST SERVICE标头。

我创建了一个动态WCF-WebHTTP端口,并在业务流程中的消息分配中进行了整个标头计算。它可以工作,但是我想创建静态端口。 如何实现正文和标头检查-如何计算请求正文的签名并将结果通过静态WCF-WebHTTP端口传递给同一请求的标头?

解决方法

我终于可以通过自定义行为来实现这一点。

把戏是从原来的base64编码中解码出body的二进制形式

这里是我如何操纵身体的示例代码:

private Message TransformMessage2(Message oldMessage) { 

Message newMessage = null; 

MessageBuffer msgbuf = oldMessage.CreateBufferedCopy(int.MaxValue);

Message tmpMessage = msgbuf.CreateMessage();

XmlDictionaryReader xdr = tmpMessage.GetReaderAtBodyContents

XmlDocument xdoc = new XmlDocument(); 

xdoc.Load(xdr); xdr.Close(); 

byte[] bodyByte = Convert.FromBase64String(xdoc.InnerXml.ToString().Replace("<Binary>","").Replace("</Binary>",""));

String bodyString = Encoding.UTF8.GetString(bodyByte,bodyByte.Length); 

bodyString = bodyString.Replace("1234321","9999999"); 

bodyByte = Encoding.UTF8.GetBytes(bodyString);

bodyString = "<Binary>" + Convert.ToBase64String(bodyByte) + "</Binary>"; 

xdoc = new XmlDocument(); 

xdoc.LoadXml(bodyString); 

MemoryStream ms = new MemoryStream(); 

XmlWriter xw = XmlWriter.Create(ms);

xdoc.Save(xw); xw.Flush(); xw.Close();  ms.Position = 0; 

XmlReader xr = XmlReader.Create(ms);

newMessage = Message.CreateMessage(oldMessage.Version,null,xr);   newMessage.Headers.CopyHeadersFrom(oldMessage); 

newMessage.Properties.CopyProperties(oldMessage.Properties); 

return newMessage;  }