调用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
答案 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