2011-06-24 39 views
17

Đây là chức năng của tôi. Tôi đã gói cả khách hàng và tin nhắn vào khoản sử dụng và vẫn gặp lỗi khi chạy kiểm tra mã. điểm lỗi đến đầu tiên sử dụng dòng:Kiểm tra mã cho biết tôi cần phải vứt bỏ vật thể. Cái nào?

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

này được cảnh báo tôi nhận được:

Cảnh báo 1 CA2000: Microsoft.Reliability: Trong phương pháp 'Email.Send (MailItem)', đối tượng ' <> g_ initLocal0 'không được xử lý cùng với tất cả các đường dẫn ngoại lệ. Hãy gọi System.IDisposable.Dispose trên đối tượng '<> g _initLocal0' trước khi tất cả các tham chiếu vào đó nằm ngoài phạm vi . C: \ CodeWorkspace \ Mã \ Utility \ Email.cs 41

+2

Bạn đang ở dòng 41 trong mã của mình? – BrokenGlass

+0

@BrokenGlass: * là gì * ở dòng 41 trong mã của anh ấy? – Mehrdad

+0

@Mehrdad: Không thể nói rằng đây chỉ là một phần của mã trong tệp. – BrokenGlass

Trả lời

18

Vấn đề của bạn là dòng này:

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

Các initializer khối { From = ... } được thực hiện sau khi các đối tượng được xây dựng và trước khi using khối của nội try/finally bắt đầu.

Nếu công cụ xây dựng MailAddress (hoặc biểu thức đối số của nó hoặc giao cho From nếu đó là người truy cập thuộc tính) ném ngoại lệ, MailMessage sẽ không được xử lý.

Thay đổi:

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

Các <>g_initLocal0 biến tạm thời là tên của MailMessage trước khi nó được giao cho msg.

+0

Đã tạo nội dung "Từ" bên trong khối và thì đấy! – katit

+0

Tôi đã gặp phải điều này trước đây với các đối tượng khác nhau nhưng hoàn cảnh tương tự. Đặt MailAddress sau khi MailMessage đã được xây dựng. –

Các vấn đề liên quan