JSON解码器:未将对象引用设置为对象的实例

时间:2018-06-12 10:53:00

标签: biztalk biztalk-2016

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

  

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

以及来自Insomnia调用的响应是:null

我通过使用BRE管道框架从Mark的博客中找到this solution,但我没有使用BRE。

我认为创建一个自定义组件管道来用空体取代空响应,有没有更好的建议?

我正在使用BTS 2016 CU4

1 个答案:

答案 0 :(得分:0)

Microsoft FIX: WCF-WebHTTP Two-Way Send Response responds with an empty message and causes the JSON decoder to fail in BizTalk Server有一个可能的解决方案,但2016年是CU2,所以看起来它们没有100%解决问题,除非你没有填充AddMessageBodyForEmptyMessage属性。

Mark的解决方案更多地与由具有空值的JSON编码器创建的JSON有效负载中的一些元素有关,这本身就是解决JSON编码器中将空字符串更改为空的错误。< / p>

如果您不想使用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