2011-06-24 65 views
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'不會被配置爲 。致電 System.IDisposable.Dispose對象 '<> 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"]) }) 

在構造對象後塊{ 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

+0

在block中移動了「From」的創建,瞧! – katit

+0

我以前遇到過不同的對象,但類似的情況。 MailMessage構建完成後設置MailAddress。 –