BizTalk Часть 'part' сообщения '<MessageName>' содержит ноль байтов данных - PullRequest
2 голосов
/ 29 февраля 2012

Я получаю эту ошибку в форме Назначения сообщений в моей оркестровке. В этой форме назначения я пытаюсь выполнить запрос XPath для извлечения закодированной строки base64 из сообщения, полученного WCF. Затем я пытаюсь загрузить переменную 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)» , Экземпляр службы будет приостановлен до административного возобновления или прекращения. Если возобновить, экземпляр продолжит свое последнее сохраненное состояние и может повторно выдать то же неожиданное исключение. Идентификатор экземпляра: c398fd2a-b654-4981-be13-94146d640375 Имя формы: Send_StreamedDocument ShapeId: bc7a463b-eed2-4222-b2f7-3fdb1e44a3c5 Исключение: сегмент 1, прогресс 25 Внутреннее исключение: часть 'part' сообщения 'Output' содержит ноль байтов данных.

Тип исключения: EmptyPartException Источник: Microsoft.XLANGs.Engine Целевой сайт: System.IO.Stream Persist (System.String ByRef, Boolean) Следующее является трассировкой стека, которая идентифицирует местоположение, где произошло исключение в Microsoft.XLANGs.Core.Part.Persist (String & encoding, Boolean wantEncoding) в Microsoft.BizTalk.XLANGs.BTXEngine.BTXXlangStore.StagePartData (Часть часть) в Microsoft.BizTalk.XLANGs.BTXEngine.BTXXlangStore.PrepareMessage (XLANGMessage msg, IList promoProps, IList toPromote) в Microsoft.BizTalk.XLANGs.BTXEngine.BTXXlangStore.WriteMessageState (IBTPEPInfoLookup pepLookup, идентификатор порта Guid, XLANGMessage msg, сегмент Seg, имя строки, URL-адрес строки, продвижение IList, логическая дорожка, IList toPromote) в Microsoft.BizTalk.XLANGs.BTXEngine.BTXLogicalPortBinding.SendMessage (XLANGMessage msg, хранилище XlangStore, сегмент Seg, OperationInfo op, дополнительные предложения IList, IList toPromote, Boolean ignoreRoutingFailure) в Microsoft.BizTalk.XLANGs.BTXEngine.BTXPortBase.SendMessage (Int32 iOperation, XLANGMessage msg, Correlation [] initCorrelations, Correlation [] followCorrelations, контекст cxt, сегмент seg, флаги ActivityFlags) в IAS.Integration.Services.Orchestrations.MainOrchestration.segment1 (StopConditions stopOn) в Microsoft.XLANGs.Core.SegmentScheduler.RunASegment (Сегменты s, StopConditions stopCond, Exception & exp) **

1 Ответ

1 голос
/ 09 марта 2012

Я вижу, что это происходит, когда вы сериализуете сообщение как часть сохраняющегося состояния непосредственно перед его отправкой.«Имя формы: Send_StreamedDocument»

Определяется ли ваше сообщение 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?

...