我有一个 BizTalk 2013 应用程序(不是 R2),需要将 Json 文档发送到外部供应商的 RESTful api。供应商需要三个 Http 标头:
内容类型:应用程序/json
日期:ISO8601 UTC 格式
授权:自定义身份验证。使用包含上述日期值的构造字符串通过 HMACSHA1 哈希运行
在 BizTalk 中,我的出站 (xml) 消息发送到发送端口,有一个自定义管道组件使用 JSON.Net 转换为 Json。到目前为止,一切都很好。为了添加每条消息唯一的标头,我创建了一个实现 IClientInspector 和 IEndpointBehavior 的 WCF 行为扩展。在 BeforeSendRequest() 中,我获得了对请求的 HttpRequestMessageProperty 的引用。
我可以成功地将 ContentType 标头和 Authorization 标头添加到 Headers Collection。我无法添加 Date 标头 - 没有错误,只是在使用 Fiddler 检查时没有标头值。
我在某处读到 Date 是一个受限制的标题,对于一种解决方法,我可以使用 Reflection 来解决它。例如
MethodInfo priMethod = headers.GetType().GetMethod("AddWithoutValidate", BindingFlags.Instance | BindingFlags.NonPublic);
priMethod.Invoke(headers, new[] { "Date", ISODateTimestamp });
那也没有用。我真的很困惑: 1. 为什么我的请求中根本没有 Date 标头?2.如果有一个,我怎么能操纵它,因为我需要给它是“限制的”?
我尝试了两种不同的选择: WCF 行为扩展:
public object BeforeSendRequest(ref Message request, System.ServiceModel.IClientChannel channel)
{
System.Diagnostics.Debug.Print("Entering BeforeSendRequest()");
try
{
HttpRequestMessageProperty httpRequest = null;
if (request.Properties.ContainsKey(HttpRequestMessageProperty.Name))
{
httpRequest = request.Properties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty;
}
WebHeaderCollection headers = httpRequest.Headers;
headers.Add(HttpRequestHeader.ContentType, "application/json");
headers.Add(string.Format("{0}:{1}", "Date", _taxwareHelper.ISODateTimestamp));
headers.Add("tweDate", _taxwareHelper.ISODateTimestamp);
headers.Add(HttpRequestHeader.Authorization, _taxwareHelper.AuthorizationString);
和发送管道中的自定义管道组件
string httpHeaderValue =
new StringBuilder()
.Append("Content-Type: application/json")
.Append("\n")
//.Append(string.Format("Date:{0}", taxwareHelper.ISODateTimestamp))
//.Append("\n")
.Append(string.Format("Date:{0}", "Fri, 10 Jul 2015 08:12:31 GMT"))
.Append("\n")
.Append(string.Format("tweDate:{0}", taxwareHelper.ISODateTimestamp))
.Append("\n")
.Append(string.Format("Authorization:{0}", taxwareHelper.AuthorizationString))
.ToString();
pInMsg.Context.Write("HttpHeaders", "http://schemas.microsoft.com/BizTalk/2006/01/Adapters/WCF-properties", httpHeaderValue);
在任何一种情况下,我都可以设置 Content-Type、授权和测试日期 - tweDate 只是为了测试,但我不能设置实际的 Date 标头。