Nicht auf einen geschlossenen stream beim senden der Anlage

Ich versuche zum senden von E-Mail mit attachment mit C#. Hier ist meine Methode:

public void SendEmail(string from, string to, SmtpClient client)
    {
        MailMessage mm = new MailMessage(from, to, "Otrzymałeś nowe zamówienie od "+from , "Przesyłam nowe zamówienie na sprzęt");
        mm.BodyEncoding = UTF8Encoding.UTF8;
        mm.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
        //Adding attachment:

        System.IO.MemoryStream ms = new System.IO.MemoryStream();
        System.IO.StreamWriter writer = new System.IO.StreamWriter(ms);
        writer.Write("Hello its my sample file");
        writer.Flush();
        writer.Dispose();

        System.Net.Mime.ContentType ct = new System.Net.Mime.ContentType(System.Net.Mime.MediaTypeNames.Text.Plain);
        System.Net.Mail.Attachment attach = new System.Net.Mail.Attachment(ms, ct);
        attach.ContentDisposition.FileName = "myFile.txt";

        mm.Attachments.Add(attach);
        try
        {
            client.Send(mm);
        }
        catch(SmtpException e)
        {
            Console.WriteLine(e.ToString());
        }
        ms.Close();
    }

stacktrace Punkte für diese Zeile:

client.Send(mm);

problem verursacht, indem Sie diese Zeile:

writer.Dispose();

Warum kann ich nicht über dieses element rechts, nachdem Sie es zu schreiben in MemoryStream?
Dieses element nicht verwendet wird, einem späteren Zeitpunkt in den code.

  • warum nicht versuchen using block.
  • Die Entsorgung der streamwriter verfügt AUCH über die zugrunde liegenden stream. Nennen Sie den Autor.Entsorgen Sie NACH der E-Mail gesendet wurde.
  • Ich fand, dass, wenn der Betrieb auf Stream Objekte, die using Schlüsselwort ist extrem nützlich. Wie @HassanNisar erwähnt, versuchen Sie es. Es macht den code um einiges lesbarer, und Sie sollten in der Lage sein, um zu vermeiden, die Ausnahme, Sie sind immer im moment.
  • Wie rene bereits erwähnt, schliessen oder durch ein StreamWriter, schließt auch die zugrunde liegende basestream (memorystream in diesem Fall). Wenn Sie brauchen, um die Wiederverwendung der gleichen memorystream, können Sie frei nach dem senden, wie vorgeschlagen, oder wenn Sie mit .net 4.5, können Sie erstellen Sie einen streamwriter, die Blätter der basestream öffnen Sie mit dem folgenden Konstruktor: msdn.microsoft.com/EN-US/library/....
InformationsquelleAutor szpic | 2014-05-19
Schreibe einen Kommentar