问题描述
我需要将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; }