BizTalk - 设置电子邮件 contentType 导致错误:XML 文档中存在错误 (1, 1)

Posted

技术标签:

【中文标题】BizTalk - 设置电子邮件 contentType 导致错误:XML 文档中存在错误 (1, 1)【英文标题】:BizTalk - Setting email contentType causes error: There is an error in XML document (1, 1) 【发布时间】:2021-04-05 09:35:15 【问题描述】:

当我尝试在 BizTalk 业务流程中设置 Microsoft.XLANGs.BaseTypes.ContentType 时,我收到一个 XML 错误(无论我使用的是“text/plain”还是“text/xml”。我使用的是动态使用 PassThru 管道发送端口。

msg_Email.BodyPart = new Ledger6002.Component.RawString("See attached email. Method 2"); 
msg_Email.AttachmentPart = msg_Ledger6002_File_XmlDoc;

// 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.AttachmentPart(MIME.FileName) =  attachmentName; 

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

导致此错误:

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: 216e4bac-0f22-4e06-9e61-2ef46051c991
Shape name: msg_Email
ShapeId: e7ce3f54-0558-4756-a7e4-e3800721178f
Exception thrown from: segment 1, progress 55
Inner exception: There is an error in XML document (1, 1).
        
Exception type: InvalidOperationException
Source: System.Xml
Target Site: System.Object Deserialize(System.Xml.XmlReader, System.String, System.Xml.Serialization.XmlDeserializationEvents)
The following is a stack trace that identifies the location where the exception occured

   at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
   at System.Xml.Serialization.XmlSerializer.Deserialize(TextReader textReader)
   at Microsoft.XLANGs.Core.Value.GetObject(Type t)
   at Microsoft.XLANGs.Core.Value._prepareForWrite(PreferredValueRepresentation pvr)
   at Microsoft.XLANGs.Core.ValueTable.PrepareForWrite(ValueToken& vt, PreferredValueRepresentation pvr)
   at Microsoft.XLANGs.Core.Part.PrepareForWrite(PreferredValueRepresentation pvr)
   at Microsoft.XLANGs.Core.Part.SetPartProperty(Type propType, Object val)
   at Microsoft.XLANGs.Core.Part.SetPropertyValue(Type propType, Object val)
   at Ledger6002.Logic.Ledger6002_Process_File.segment1(StopConditions stopOn)
   at Microsoft.XLANGs.Core.SegmentScheduler.RunASegment(Segment s, StopConditions stopCond, Exception& exp)
Additional error information:

        Data at the root level is invalid. Line 1, position 1.
        
Exception type: XmlException
Source: System.Xml
Target Site: Void Throw(System.Exception)
The following is a stack trace that identifies the location where the exception occured

   at System.Xml.XmlTextReaderImpl.Throw(Exception e)
   at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)
   at System.Xml.XmlTextReaderImpl.ParseRootLevelWhitespace()
   at System.Xml.XmlTextReaderImpl.ParseDocumentContent()
   at System.Xml.XmlTextReaderImpl.Read()
   at System.Xml.XmlTextReader.Read()
   at System.Xml.XmlReader.MoveToContent()
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderObject.Read2_anyType()
    

msg_email 是多部分消息,包含两部分:bodyPart 和 attachmentPart,均定义为 RawString 自定义类。

什么可能导致此错误?我需要使用 MIME/Encoder 的管道吗?

我现在在另一个客户处,尝试回答 2017 年的问题(但使用编排而不是管道):How Set Attachment Name to Show Properly in Outlook

当我注释掉设置 contentType 的两行时,我收到一封电子邮件,但问题与上面 2017 年帖子中提到的问题相同。

【问题讨论】:

【参考方案1】:

你至少缺少两件事:

使用 SMTP.MessagePartsAttachments 设置并将其设置为“2” 使用 SMTP.EmailBodyTextCharset 并将其设置为“UTF-8”

【讨论】:

我有很多变化,我尝试过这些和其他。我把我所有的 SMTP 设置都放在了不同的形状中,我设置了主题、收件人、发件人等……但我会尝试使用这些并报告回来。但问题是为什么 ContentType 会给出错误。也许您正在回答我关于为什么电子邮件仅显示 body.txt 的较早的更一般的问题? 新错误:消息“msg_Email”的“附件部分”部分在构造块的末尾包含空值。所有这些 SMTP 参数的排列数量非常多,并且它们都必须精确才能使其工作。我发现通过 C# 发送非常简单,但尝试使用“BizTalk 方式”进行发送。 程序编译时使用 msg_Email(SMTP.MessagePartsAttachments) = 2;或 msg_Email,AttachmentPart(SMTP.MessagePartsAttachments) = 2;在我的情况下应该使用哪一个? 使用 msg_Email(SMTP.MessagePartsAttachments) = 2 还可以尝试为 attachmentName 设置硬编码值,以确保它具有值。还要确保在您的多部分消息中,附件是编排消息中的第二部分(您定义它的位置)。

以上是关于BizTalk - 设置电子邮件 contentType 导致错误:XML 文档中存在错误 (1, 1)的主要内容,如果未能解决你的问题,请参考以下文章

Biztalk:包含映射到 CSV 的电子邮件的 XML,作为附件发送

BizTalk 2010 SMTP 适配器中的附件非英语名称

BizTalk SMTP 发送带有附件的邮件(无编排,自定义发送管道组件)

正文部分在 biztalk 动态 SMTP 发送端口中作为附件发送

如何设置多开发者 Biztalk 环境?

从 BizTalk 2010 迁移到 BizTalk 2020