BizTalk WCF-WebHTTP REST Client with Body and Header Sign with static port
BizTalk WCF-WebHTTP REST Client with Body and Header Sign with static port
我需要将 REST 客户端写入需要自定义 Headers 和 JSON body.
的服务(我们称之为 REST 服务)
header 中的两个必须根据 header 中的其他值(也是动态的)和整个 JSON body 计算签名。
我还托管了一个将用于为我的客户提供服务的 Web 服务。在我的服务的 body 中,有一些值需要传递给 REST SERVICE 的 header。
我在编排的消息分配中进行了动态 WCF-WebHTTP 端口和整个 header 计算。它有效,但我想创建静态端口。
如何实现 body 和 header 检查 - 如何计算请求 body 的签名并将结果传递给具有静态 WCF-WebHTTP 端口的同一请求的 header?
我终于能够通过我的自定义行为完成此操作。
技巧是解码 body 的二进制形式,结果是 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, 0, 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; }
我需要将 REST 客户端写入需要自定义 Headers 和 JSON body.
的服务(我们称之为 REST 服务)header 中的两个必须根据 header 中的其他值(也是动态的)和整个 JSON body 计算签名。
我还托管了一个将用于为我的客户提供服务的 Web 服务。在我的服务的 body 中,有一些值需要传递给 REST SERVICE 的 header。
我在编排的消息分配中进行了动态 WCF-WebHTTP 端口和整个 header 计算。它有效,但我想创建静态端口。 如何实现 body 和 header 检查 - 如何计算请求 body 的签名并将结果传递给具有静态 WCF-WebHTTP 端口的同一请求的 header?
我终于能够通过我的自定义行为完成此操作。
技巧是解码 body 的二进制形式,结果是 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, 0, 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; }