17

これが私の機能です。クライアントとメッセージの両方をすでに using 句にラップしていますが、コード インスペクションを実行するとエラーが発生します。最初に行を使用するエラーポイント:

public static void Send(MailItem mail)
        {
            var sender = Membership.GetUser(mail.CreatedBy);
            if (sender == null)
            {
                return;
            }

            using (var msg = new MailMessage { From = new MailAddress(ConfigurationManager.AppSettings["EmailSender"], ConfigurationManager.AppSettings["EmailSenderName"]) })
            {
                foreach (var recipient in mail.MailRecipients)
                {
                    var recipientX = Membership.GetUser(recipient.UserKey);
                    if (recipientX == null)
                    {
                        continue;
                    }

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

                msg.Subject = "[From: " + sender.UserName + "]" + mail.Subject;
                msg.Body = mail.Body;

                if (HttpContext.Current != null)
                {
                    msg.Body += Environment.NewLine + Environment.NewLine + "To reply via Web click link below:" +
                                Environment.NewLine;
                    msg.Body += ConfigurationManager.AppSettings["MailPagePath"] + "?AID=" +
                                ContextManager.CurrentAccount.AccountId + "&RUN=" + sender.UserName;
                }

                try
                {
                    using (var emailClient = new SmtpClient())
                    {
                        emailClient.Send(msg);
                    }
                }
                catch (Exception ex)
                {
                    Logger.LogException(ex);
                }
            }
        }

これは私が得る警告です:

警告 1 CA2000 : Microsoft.Reliability : メソッド 'Email.Send(MailItem)' で、オブジェクト '<> g_initLocal0' がすべての例外パスで破棄されていません。オブジェクト '<>g _initLocal0' で System.IDisposable.Dispose を呼び出してから、オブジェクトへのすべての参照が範囲外になります。C:\CodeWorkspace\Code\Utility\Email.cs 41

4

1 に答える 1

18

あなたの問題はこの行です:

using (var msg = new MailMessage { From = new MailAddress(ConfigurationManager.AppSettings["EmailSender"], ConfigurationManager.AppSettings["EmailSenderName"]) }) 

初期化ブロック{ From = ... }は、オブジェクトが構築された後、usingブロックの内部try/finallyが始まる前に実行されます。

MailAddressコンストラクター (またはその引数式、またはプロパティ アクセサーの場合はへの代入)Fromが例外をスローした場合、 は破棄MailMessageされません。

への変更:

using (var msg = new MailMessage()) 
{
    msg.From = new MailAddress(ConfigurationManager.AppSettings["EmailSender"], ConfigurationManager.AppSettings["EmailSenderName"]);
    ...
}

一時<>g_initLocal0変数は、に割り当てられる前の MailMessage の名前ですmsg

于 2011-06-24T20:54:06.587 に答える