BizTalk SMTP. Часть PartAttachment сообщения msg_Email содержала нулевое значение в конце блока конструкции.

Краткое описание проблемы - когда я устанавливаю RawString на текст, электронное письмо с вложением отправляется с правильным именем. Когда я устанавливаю вложение для сообщения RawString, я получаю сообщение об ошибке. Часть «PartAttachment» сообщения «msg_Email» содержала нулевое значение в конце блока конструкции.

Я создал свой собственный класс RawString, который использовал раньше. Оркестровка получает файл CSV через сквозной конвейер. Следуя некоторой документации, которую я нашел, я получаю XmlDocument и в следующей форме конструирую RawString следующим образом:

msg_Raw_String.MessagePart_1 = msg_Ledger6002_File_XmlDoc;

Однако, если я установил фиктивный текст в RawString, электронное письмо с вложением будет отправлено (вложение - это просто текстовый файл со значением ниже:

   msg_Email.PartAttachment = new XXXLedger6002.Component.RawString("Test Text"); 

Полный код в назначении сообщения:

msg_Email.BodyPart = new XXXLedger6002.Component.RawString("See attached email. Method 2 Dynamic"); 

// Force some value to make sure it is not null 
//msg_Email.PartAttachment = new Ledger6002.Component.RawString("Test Text"); 
// Tried both of these, same error: 
//msg_Email.PartAttachment = msg_Ledger6002_File_XmlDoc;
msg_Email.PartAttachment = msg_Raw_String.MessagePart_1; 
// syntax doesn't allow this: 
// msg_Email.PartAttachment = msg_Raw_String;


// Set the filename as it should display on the attachment in the email 
// (drop the path, just the filename/extension)
attachmentName = System.IO.Path.GetFileName(
                       msg_Ledger6002_File_XmlDoc(FILE.ReceivedFileName));

msg_Email.PartAttachment(MIME.FileName) =  attachmentName; 

//msg_Email.BodyPart(Microsoft.XLANGs.BaseTypes.ContentType) = "text/plain";//
//msg_Email.AttachmentPart(Microsoft.XLANGs.BaseTypes.ContentType) = "text/plain";

msg_Email(SMTP.Subject) = "Ledger6002 File";
msg_Email(SMTP.SMTPTo) = msg_Config_Email.smtpToEmail;
msg_Email(SMTP.From) = msg_Config_Email.smtpFromEmail; 
msg_Email(SMTP.SMTPAuthenticate) = 0;   // do not authenticate to SMTP server 
msg_Email(SMTP.SMTPHost) = msg_Config_Email.smptHostName; 

// msg_Email(SMTP.EmailBodyText) = "UTF-8"; 
msg_Email(SMTP.EmailBodyTextCharset)  = "UTF-8"; 
msg_Email(SMTP.MessagePartsAttachments) = 2; 

// No email generated with comment out line, trying same without mailto:
SMTP_Dyn_Email(Microsoft.XLANGs.BaseTypes.Address) = "mailto:" + msg_Config_Email.smtpToEmail; 

SMTP_Dyn_Email(Microsoft.XLANGs.BaseTypes.TransportType) = "SMTP";

Ошибка:

xlang/s engine event log entry: Uncaught exception (see the 'inner exception' below) has suspended an instance of service 'Ledger6002.Logic.Ledger6002_Process_File(9eb6993c-87d0-7bf0-b0bf-e1f684000af2)'.
The service instance will remain suspended until administratively resumed or terminated. 
If resumed the instance will continue from its last persisted state and may re-throw the same unexpected exception.
InstanceId: ecaa7ed2-04c1-46b9-b845-cf3211b83387
Shape name: Send_Dyn_Email
ShapeId: 4ada59c3-367e-40b4-babc-d0d9999feb77
Exception thrown from: segment 1, progress 60
Inner exception: The part 'PartAttachment' of message 'msg_Email' contained a null value at the end of the construct block.
        
Exception type: NullPartException
Source: Microsoft.XLANGs.Engine
Target Site: System.IO.Stream Persist(System.String ByRef, Boolean)
The following is a stack trace that identifies the location where the exception occured

   at Microsoft.XLANGs.Core.CustomFormattedPart.Persist(String& encoding, Boolean wantEncoding)
   at Microsoft.BizTalk.XLANGs.BTXEngine.BTXXlangStore.StagePartData(Part part)
   at Microsoft.BizTalk.XLANGs.BTXEngine.BTXXlangStore.PrepareMessage(XLANGMessage msg, IList promoteProps, IList toPromote)
   at Microsoft.BizTalk.XLANGs.BTXEngine.BTXXlangStore.WriteMessageState(IBTPEPInfoLookup pepLookup, Guid portId, XLANGMessage msg, Segment seg, String opname, String url, IList promoteProps, Boolean track, IList toPromote)
   at Microsoft.BizTalk.XLANGs.BTXEngine.BTXLogicalPortBinding.SendMessage(XLANGMessage msg, XlangStore store, Segment seg, OperationInfo op, IList additionalProps, IList toPromote, Boolean ignoreRoutingFailure)
   at Microsoft.BizTalk.XLANGs.BTXEngine.BTXPortBase.SendMessage(Int32 iOperation, XLANGMessage msg, Correlation[] initCorrelations, Correlation[] followCorrelations, Context cxt, Segment seg, ActivityFlags flags)
   at Ledger6002.Logic.Ledger6002_Process_File.segment1(StopConditions stopOn)
   at Microsoft.XLANGs.Core.SegmentScheduler.RunASegment(Segment s, StopConditions stopCond, Exception& exp)
    

person NealWalters    schedule 30.12.2020    source источник


Ответы (1)


Ниже приводится обходной путь, который, кажется, работает.

msg_Email.PartAttachment = new SBA.Ledger6002.Component.RawString(
                                msg_Raw_String.MessagePart_1.ToString()); 

Если кто-нибудь может объяснить, почему я просто не могу установить его на msg_Raw_String.MessagePart_1, я хотел бы знать.

person NealWalters    schedule 30.12.2020