2011-06-24 5 views
17

これは私の機能です。私はすでにクライアントとメッセージの両方をusing句にラップし、コード検査を実行するとエラーが発生します。エラーポイントは最初の行を使用する: Microsoft.Reliability:方法 'においてEmail.Send(MailItem)'、オブジェクト 'コード検査では、オブジェクトを破棄する必要があると言います。どれ?

1 CA2000警告:

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); 
       } 
      } 
     } 

これは私が取得警告されます<> g_ initLocal0 'はすべての例外パスに沿って に配置されていません。 System.IDisposable.Dispose on object '<> g _initLocal0'すべての への参照は スコープ外です。 C:\ CodeWorkspace \コード\ユーティリティ\ Email.cs 41

+2

あなたのコードの41行目は何ですか? – BrokenGlass

+0

@BrokenGlass:彼のコードの41行目の*は何ですか? – Mehrdad

+0

@Mehrdad:これはファイル内のコードの一部にすぎないと考えることは不可能です。 – BrokenGlass

答えて

18

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

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

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

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

変更:それはmsgに割り当てられます前に

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

一時的<>g_initLocal0変数ははMailMessageの名前です。

+0

ブロック内の "From"の作成を移動しました。 – katit

+0

これまで私はこれまでにさまざまなオブジェクトで似たような状況に遭遇しました。 MailMessageが構築された後にMailAddressを設定します。 –

関連する問題