0

我有一个 BizTalk 2013 应用程序(不是 R2),需要将 Json 文档发送到外部供应商的 RESTful api。供应商需要三个 Http 标头:

  1. 内容类型:应用程序/json

  2. 日期:ISO8601 UTC 格式

  3. 授权:自定义身份验证。使用包含上述日期值的构造字符串通过 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 标头。

4

1 回答 1

0

是的,确实 Date 是一个特殊的 HTTP 标头,它表示消息产生的日期和时间,但这并不妨碍您使用它。但是日期必须采用 RFC 822 格式 1994 年 11 月 15 日星期二 08:12:31 GMT
另一件事为什么你要通过编码行为来让它变得艰难,而你可以使用 HTTPHeaders 在自定义管道中添加自定义标头组件加上这更干净

因此,请尝试以正确的格式转换您的日期或使用 HTTPHeaders

http://www.codit.eu/blog/2013/04/30/using-httpheaders-with-wcf-webhttp-adapter-on-biztalk-2013/ http://www.w3.org/Protocols/rfc2616/ rfc2616-sec14.html

于 2015-07-09T22:47:33.540 回答