Декодер JSON: ссылка на объект не установлена ​​для экземпляра объекта - PullRequest
0 голосов
/ 12 июня 2018

Я получаю следующую ошибку в конвейере приема JSON при вызове API получения REST:

Произошла ошибка при выполнении конвейера ответа (приема): "mycustomPiepeline, mycustomPieplelineAssembly, Version = 1.0.0.0, Culture = нейтральный, PublicKeyToken = 70f46ad2a5c6e8c0 "Источник:" JSON decoder "Порт отправки:" Мой порт отправки webHttp "URI:" URL "Причина: ссылка на объект не установлена ​​для экземпляра объекта.

, а также от звонка от бессонницы ответ: null

Я нашел это решение из блога Марка с использованием инфраструктуры конвейера BRE, но я неиспользуя BRE.

Я думаю, что для создания пользовательского конвейера компонентов для замены пустого ответа пустым телом, есть ли лучшие предложения?

Я использую BTS 2016 CU4

1 Ответ

0 голосов
/ 13 июня 2018

Существует возможное исправление от Microsoft ИСПРАВЛЕНИЕ: Ответ двусторонней отправки WCF-WebHTTP отвечает пустым сообщением и приводит к сбою декодера JSON на BizTalk Server , но это было в CU2 на 2016 год, поэтомупохоже, что они не решили проблему на 100%, если вы не заполнили свойство AddMessageBodyForEmptyMessage.

Решение Марка больше связано с некоторыми элементами в полезной нагрузке JSON, созданными JSON Encoder, имеющими нулевое значение, что само по себе является обходным решением для ошибки в JSON Encoder, которая превращает пустую строку в ноль.

Если вы не хотите использовать компонент конвейера BRE (который, мы надеемся, будет доступен для BizTalk2016, очень скоро, когда я знаю, что над ним ведутся работы), вы можете свернуть свой собственный, например, ниже, где 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
...