5

考虑这段代码

private MailMessage GetMailMessageFromMailItem(Data.SystemX.MailItem mailItem)
        {

            var msg = new MailMessage();

            foreach (var recipient in mailItem.MailRecipients)
            {
                var recipientX = Membership.GetUser(recipient.UserKey);
                if (recipientX == null)
                {
                    continue;
                }

                msg.To.Add(new MailAddress(recipientX.Email, recipientX.UserName));
            }

            msg.From = new MailAddress(ConfigurationManager.AppSettings["EmailSender"],
                                   ConfigurationManager.AppSettings["EmailSenderName"]);

            msg.Subject = sender.UserName;
            if (!string.IsNullOrEmpty(alias)) msg.Subject += "(" + alias + ")";
            msg.Subject += " " + mailItem.Subject;
            msg.Body = mailItem.Body;
            msg.Body += Environment.NewLine + Environment.NewLine + "To reply via Web click link below:" + Environment.NewLine;
            msg.Body += ConfigurationManager.AppSettings["MailPagePath"] + "?AID=" + ContextManager.AccountId + "&RUN=" + sender.UserName;

            if (mailItem.MailAttachments != null)
            {
                foreach (var attachment in mailItem.MailAttachments)
                {
                    msg.Attachments.Add(new Attachment(new MemoryStream(attachment.Data), attachment.Name));
                }
            }

            return msg;
        }

我只是将我的数据库类型转换为 MailMessage。它在另一个函数中发送。

代码分析告诉我我没有处理正确的“msg”。但是,如果我在这里执行此操作-尝试发送时会出现异常。

此外,它抱怨没有在这里处理 MemoryStream :

msg.Attachments.Add(new Attachment(new MemoryStream(attachment.Data), attachment.Name));

我不知道如何正确处理它。我尝试了不同的方法,但在发送邮件说“流已关闭”时出现异常

4

3 回答 3

2

基本上你不应该 -稍后处理邮件将处理每个附件,这将处理每个流。此外,不处理MemoryStream未用于远程处理的对象不会造成任何伤害。

我建议您取消此方法的警告。

编辑:我怀疑你可以[SuppressMessage]用来抑制消息。


请注意,某些代码可能会在方法的中途抛出代码,因此即使您using在调用代码中有一条语句,您最终也永远无法处理该消息。如果你真的很困扰,你可以写:

private MailMessage GetMailMessageFromMailItem(Data.SystemX.MailItem mailItem)
{
    bool success = false;
    var msg = new MailMessage();
    try
    {
        // Code to build up bits of the message
        success = true;
        return msg;
    }
    finally
    {
        if (!success)
        {
            msg.Dispose();
        }
    }
}

不过,我个人会说这是矫枉过正。

于 2011-08-19T17:41:28.010 回答
0

关于“不处理“味精””,我能想到的唯一方法是不要返回 MailMessage,而是传递对 MailMessage 的引用。像这样的东西。不确定这是否是个好主意。

private void GetMailMessageFromMailItem(ref MailMessage msg, Data.SystemX.MailItem mailItem)
于 2011-08-19T17:42:56.297 回答
-1

一次性对象的创建者也应该处置它。如果你不能在这里处理消息,那么它应该从其他地方的创建者那里传递过来。在这种情况下,代码分析是正确的,如果您忽略这些消息,您最终可能会遇到非常不幸且难以调试的泄漏。

于 2011-08-19T19:33:38.543 回答