Domanda

Sto cercando di inviare e-mail in modo asincrono e funziona bene fino a quando non c'è un'AlternateView allegato alla e-mail. Quando v'è una visualizzazione alternativa, ottengo il seguente errore:

Cannot access a disposed object. Object name: 'System.Net.Mail.AlternateView'
System.Net.Mail.SmtpException: Failure sending mail. ---> System.ObjectDisposedException: Cannot access a disposed object.

Object name: 'System.Net.Mail.AlternateView'.
   at System.Net.Mail.AlternateView.get_LinkedResources()
   at System.Net.Mail.MailMessage.SetContent()
   at System.Net.Mail.MailMessage.BeginSend(BaseWriter writer, Boolean sendEnvelope, AsyncCallback callback, Object state)
   at System.Net.Mail.SmtpClient.SendMailCallback(IAsyncResult result)

Ecco alcuni esempi di codice:

Dim msg As New System.Net.Mail.MailMessage
msg.From = New System.Net.Mail.MailAddress("me@example.com", "My Name")
msg.Subject = "email subject goes here"

'add the message bodies to the mail message
Dim hAV As System.Net.Mail.AlternateView = System.Net.Mail.AlternateView.CreateAlternateViewFromString(textBody.ToString, Nothing, "text/plain")
hAV.TransferEncoding = Net.Mime.TransferEncoding.QuotedPrintable
msg.AlternateViews.Add(hAV)

Dim tAV As System.Net.Mail.AlternateView = System.Net.Mail.AlternateView.CreateAlternateViewFromString(htmlBody.ToString, Nothing, "text/html")
tAV.TransferEncoding = Net.Mime.TransferEncoding.QuotedPrintable
msg.AlternateViews.Add(tAV)

Dim userState As Object = msg
Dim smtp As New System.Net.Mail.SmtpClient("emailServer")

'wire up the event for when the Async send is completed
 AddHandler smtp.SendCompleted, AddressOf SmtpClient_OnCompleted

 Try
     smtp.SendAsync(msg, userState)
 Catch '.... perform exception handling, etc...
 End Try

E la richiamata .....

 Public Sub SmtpClient_OnCompleted(ByVal sender As Object, ByVal e As AsyncCompletedEventArgs)
    If e.Cancelled Then
      'Log the cancelled error
    End If
    If Not IsNothing(e.Error) Then
        'Log a real error....
        ' this is where the error is getting picked up
    End If

    'dispose the message
    Dim msg As System.Net.Mail.MailMessage = DirectCast(e.UserState, System.Net.Mail.MailMessage)
    msg.Dispose()

End Sub
È stato utile?

Soluzione

Il motivo per cui questo non funziona è perché il vostro gestore OnCompleted viene chiamato quando il metodo SendAsync () completa, ma che sembra essere prima che la SmtpClient ha finito fisicamente inviare l'e-mail attraverso la rete (questo avverrà solo con la rete consegna benchè, consegne di file sono sostanzialmente sincrona con SendAsync ()).

Questo sembra quasi un bug nel SmtpClient perché OnCompleted in realtà dovrebbe essere chiamato solo quando il messaggio è stato realmente inviato.

Altri suggerimenti

Ho avuto un problema molto simile. Lo stesso messaggio di errore, ma una struttura di codice leggermente diverso. Nel mio caso mi è stato Smaltimento dell'oggetto MailMessage all'interno della funzione principale. Con il tempo l'evento OnCompleted corse, l'oggetto era già andato via.

Guarda il tuo codice dopo la SendAsync per vedere se si sta liberando l'oggetto MailMessage. Ad esempio, se si sta creando all'interno di un'istruzione using, allora sarà liberato prima che l'evento asincrono viene eseguito.

Si dovrebbe mettere le si oscura a livello di classe, se si desidera accedere nel vostro callback.

private msg As System.Net.Mail.MailMessage
private hAV As System.Net.Mail.AlternateView 

private sub yoursub
  msg = new System.Net.Mail.MailMessage(..
  hAV = new ...
end sub

mia è che AlternateViews.Add solo aggiunge un riferimento di HAV, bisogni oggetto msg smaltire mentre la HAV è disposto automaticamente dal GC ..

Saluti

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top