BizTalk消息“<messagename>”的“部分”部分包含零字节数据</messagename>

时间:2012-02-29 15:27:10

标签: biztalk biztalk-2010

我在业务流程中的消息分配形状中收到此错误。在这个赋值形状中,我正在尝试执行XPath查询以从WCF接收的消息中提取base64编码的字符串。然后我尝试使用由我编写的帮助程序类生成的Stream加载XmlDocument变量。 base64字符串将是PDF或Excel文件的内容(注意:这不是XML)。我读过这可以做到。

以下是我的邮件分配中使用的表达式:

messageCreator = new IAS.Integration.Services.Helpers.MessageCreator();
System.Diagnostics.EventLog.WriteEntry("IAS.Integration.Services.Orchestration", "MessageCreator Object created");

base64 = xpath(PerformTransformationResponse, "string(/*[local-name()='PerformTransformationResponseWrapper' and namespace-uri()='http://www.iasreo.com/integration/servicetypes']/*[local-name()='TransformedPayload'])");
//System.Diagnostics.EventLog.WriteEntry("IAS.Integration.Services.Orchestration", System.String.Format("Base64 from xpath: {0}", base64));

Output = new System.Xml.XmlDocument();
System.Diagnostics.EventLog.WriteEntry("IAS.Integration.Services.Orchestration", "Output instantiated as XmlDocument");

messageCreator.CreateMyMessage(Output, base64);
System.Diagnostics.EventLog.WriteEntry("IAS.Integration.Services.Orchestration", "messageCreator.CreateMyMessage(Output, base64)");

以下是我为支持此表达式而编写的帮助程序类:

[Serializable]
public class MessageCreator
{
    public void CreateMyMessage(XLANGMessage outMessage, string binaryStringMessage)
    {
        outMessage[0].LoadFrom(new StreamFactory(binaryStringMessage));
    }
}

[Serializable]
public class StreamFactory : IStreamFactory
{
    private string messageContent;

    public StreamFactory(string inMessageContent)
    {
        messageContent = inMessageContent;
    }

    public Stream CreateStream()
    {
        byte[] messageBytes = Convert.FromBase64String(messageContent);

        return new MemoryStream(messageBytes, 0, messageBytes.Length, true, true);
    }
}

最后,这是我在事件查看器中收到的错误:

  

xlang / s引擎事件日志条目:未捕获的异常(请参阅下面的“内部异常”)已暂停服务实例'IAS.Integration.Services.Orchestrations.MainOrchestration(fcad6d68-ce54-bfa2-d035-56608b99ef52)' 。   在管理恢复或终止之前,服务实例将保持暂停状态。   如果恢复,则实例将从其上一个持久状态继续,并可能重新抛出相同的意外异常。   InstanceId:c398fd2a-b654-4981-be13-94146d640375   形状名称:Send_StreamedDocument   ShapeId:bc7a463b-eed2-4222-b2f7-3fdb1e44a3c5   引发异常:第1段,进度25   内部异常:消息“输出”的“部分”部分包含零字节数据。

     

异常类型:EmptyPartException   资料来源:Microsoft.XLANGs.Engine   目标站点:System.IO.Stream Persist(System.String ByRef,Boolean)   以下是堆栈跟踪,用于标识发生异常的位置      在Microsoft.XLANGs.Core.Part.Persist(String&amp; encoding,Boolean wantEncoding)      在Microsoft.BizTalk.XLANGs.BTXEngine.BTXXlangStore.StagePartData(部分)      在Microsoft.BizTalk.XLANGs.BTXEngine.BTXXlangStore.PrepareMessage(XLANGMessage消息,IList promoteProps,IList toPromote)      在Microsoft.BizTalk.XLANGs.BTXEngine.BTXXlangStore.WriteMessageState(IBTPEPInfoLookup pepLookup,Guid portId,XLANGMessage msg,Segment seg,String opname,String url,IList promoteProps,Boolean track,IList toPromote)      在Microsoft.BizTalk.XLANGs.BTXEngine.BTXLogicalPortBinding.SendMessage(XLANGMessage消息,XlangStore存储,Segment seg,OperationInfo op,IList additionalProps,IList toPromote,Boolean ignoreRoutingFailure)      在Microsoft.BizTalk.XLANGs.BTXEngine.BTXPortBase.SendMessage(Int32 iOperation,XLANGMessage msg,Correlation [] initCorrelations,Correlation [] followCorrelations,Context cxt,Segment seg,ActivityFlags flags)      在IAS.Integration.Services.Orchestrations.MainOrchestration.segment1(StopConditions stopOn)      在Microsoft.XLANGs.Core.SegmentScheduler.RunASegment(Segment s,StopConditions stopCond,Exception&amp; exp)**

1 个答案:

答案 0 :(得分:1)

当你在发送消息之前将消息序列化为持久化状态的一部分时,我可以看到它正在发生。 &#34;形状名称:Send_StreamedDocument&#34;

您的OutPut消息是定义为简单消息还是多部分消息?

您是否尝试将OutPut消息设为字符串而不是XMLDocument?

编辑:实际上XMLDocument本身不是可序列化的。我不知道 - 我想我总是设法在发送之前将我的消息输入到基于模式的内容。
见这里:http://talentedmonkeys.wordpress.com/2010/02/15/xmldocument-serialization-in-biztalk-2009-not/ 在这里:http://extremelytalentedmonkeys.blogspot.com/2009/12/xmldocument-serialization-not.html

您可以在原子事务中包装消息分配并发送形状,这样您就可以避免尝试保留不可序列化的内容。或者您可以使用除XMLDocument之外的其他内容?