2011-06-24 21 views
17

To jest moja funkcja. Zapakowałem już zarówno klienta, jak i wiadomość w klauzulę uzyskiwania i nadal otrzymuję komunikat o błędzie podczas uruchamiania inspekcji kodu. Punkty błędach najpierw za pomocą linii:Inspekcja kodu mówi, że muszę wyrzucić obiekt. Który?

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

To ostrzeżenie pojawia się:

Ostrzeżenie 1 CA2000: Microsoft.Reliability: W metodzie 'Email.Send (MailItem)', obiekt ' <> g_ initLocal0 'nie jest ułożona wzdłuż wszystkich ścieżek wyjątków . Zadzwoń pod System.IDisposable.Dispose na obiekt '<> g _initLocal0' przed wszystkimi odniesienia do niego są poza zasięgiem . C: \ CodeWorkspace \ Code \ Utility \ Email.cs 41

+2

Co jest w linii 41 w kodzie? – BrokenGlass

+0

@BrokenGlass: Co * jest * w linii 41 w swoim kodzie? – Mehrdad

+0

@Mehrdad: Nie można powiedzieć, biorąc pod uwagę, że jest to tylko część kodu w pliku. – BrokenGlass

Odpowiedz

18

Twój problem jest to linia:

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

Blok { From = ... } jest wykonywany po obiekt jest zbudowany i przed initializer using blok na wewnętrzny try/finally zaczyna się.

Jeżeli konstruktor MailAddress (lub jego wyrażenia argumentów lub przyporządkowanie do From jeśli jest to właściwość dostępowe) zgłasza wyjątek, MailMessage nie zostaną usunięte.

Zmiana:

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

Tymczasowa <>g_initLocal0 zmienna jest nazwą MailMessage zanim zostanie przypisany do msg.

+0

Przeniesiono tworzenie "From" wewnątrz bloku i voila! – katit

+0

Zetknąłem się z tym wcześniej z różnymi obiektami, ale z podobnymi okolicznościami. Ustaw adres mailowy po utworzeniu wiadomości MailMessage. –