0

调用 REST Get API 时,我在 JSON 接收管道上收到以下错误:

执行响应(接收)管道失败:“mycustomPiepeline,mycustomPieplelineAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=70f46ad2a5c6e8c0” 来源:“JSON 解码器” 发送端口:“我的 webHttp 发送端口” URI:“URL " 原因:对象引用未设置为对象的实例。

并且来自 Insomnia 呼叫的响应是:null

我通过使用 BRE 管道框架从 Mark 的博客中找到了这个解决方案,但我没有使用 BRE。

我想创建一个自定义组件管道来用空主体替换空响应,有没有更好的建议?

我正在使用 BTS 2016 CU4

4

1 回答 1

0

Microsoft FIX 提供了一个可能的修复:WCF-WebHTTP 双向发送响应以空消息响应并导致 JSON 解码器在 BizTalk Server 中失败,但这是 2016 年的 CU2,所以看起来他们没有解决除非您没有填充 AddMessageBodyForEmptyMessage 属性,否则问题 100%。

Mark 的解决方案更多地与 JSON 编码器创建的 JSON 有效负载中的某些元素有关,这些元素具有 null 值,这本身就是针对 JSON 编码器中将空字符串更改为 null 的错误的解决方法。

如果您不想使用 BRE 管道组件(我知道它正在处理中,希望很快可用于 BizTalk 2016),那么您可以在下面滚动您自己的,其中 InsertInEmpty 是管道上的一个参数如果您得到一个空的正文,您可以设置要返回什么消息的组件。

    #region IComponent members
    /// <summary>
    /// Implements IComponent.Execute method.
    /// </summary>
    /// <param name="pc">Pipeline context</param>
    /// <param name="inmsg">Input message</param>
    /// <returns>Original input message</returns>
    /// <remarks>
    /// IComponent.Execute method is used to initiate
    /// the processing of the message in this pipeline component.
    /// </remarks>
    public Microsoft.BizTalk.Message.Interop.IBaseMessage Execute(Microsoft.BizTalk.Component.Interop.IPipelineContext pc, Microsoft.BizTalk.Message.Interop.IBaseMessage inmsg)
    {
        string dataOut = "";
        StreamReader sr = new StreamReader(inmsg.BodyPart.Data);

        if (InsertInEmpty != "" & inmsg.BodyPart.Data.Length == 0)
        {
                dataOut = InsertInEmpty;               
        }
        else 
        {   
            dataOut = dataOut + sr.ReadToEnd();
        }
        MemoryStream ms = new System.IO.MemoryStream(System.Text.Encoding.ASCII.GetBytes(dataOut));
        inmsg.BodyPart.Data = ms;
        inmsg.BodyPart.Data.Position = 0;

        return inmsg;
    }
    #endregion
于 2018-06-12T21:24:14.320 回答