Frage

Sehen Sie diese Frage auch: Kann ich passiert eine System.Net.MailMessage zu einem WCF-Dienst?

Ich möchte Anhänge an die E-Mail gesendet werden hinzuzufügen. Attachments sind entweder Dateien auf der lokalen Festplatte oder dynamisch erstellt Streams. Ein WCF Vertrag kann einen Strom enthalten, aber nur, wenn alle Argumente vom Typ Strom sind. Also, was ist der beste Weg, eine oder mehr Anlagen zu einem WCF-Dienst zu übergeben?

War es hilfreich?

Lösung

In Ordnung ich das selbst gelöst haben. Der Trick hier ist die Bindung an eine Base64 codiert Schnur, viel die gleiche Art und Weise E-Mail-Systeme tun dies zu konvertieren. Ich habe eine Klasse erstellt, diese zu umgehen. Geschrieben hier für andere:

 [DataContract]
    public class EncodedAttachment
    {
        [DataMember(IsRequired=true)]
        public string Base64Attachment;

        [DataMember(IsRequired = true)]
        public string Name;

        /// <summary>
        /// One of the System.Net.Mime.MediaTypeNames
        /// </summary>
        [DataMember(IsRequired = true)]
        public string MediaType;
    }

 public EncodedAttachment CreateAttachment(string fileName)
        {
            EncodedAttachment att = new EncodedAttachment();
            if (!File.Exists(fileName))
                throw new FileNotFoundException("Cannot create attachment because the file was not found", fileName);

            FileInfo fi = new FileInfo(fileName);
            att.Name = fi.Name;
            att.MediaType = System.Net.Mime.MediaTypeNames.Text.Plain;

            using (FileStream reader = new FileStream(fileName, FileMode.Open))
            {
                byte[] buffer = new byte[reader.Length];
                reader.Read(buffer, 0, (int)reader.Length);
                att.Base64Attachment = Convert.ToBase64String(buffer);
            }
            return att;
        }

Und auf der Client-Seite:

public void SendEmail(SmallMessage msg)
        {
            using (MailMessage message = new MailMessage())
            {
                message.Body = msg.Body;
                message.Subject = msg.Subject;
                message.To.Add(new MailAddress(msg.To));
                message.From = new MailAddress(msg.From);
                foreach (EncodedAttachment att in msg.Attachments)
                {
                    message.Attachments.Add(CreateAttachment(att));
                }

                SmtpClient client = new SmtpClient();
                client.Send(message);
            }
        }


Attachment CreateAttachment(EncodedAttachment encodedAtt)
{
    MemoryStream reader = new MemoryStream(Convert.FromBase64String(encodedAtt.Base64Attachment));
    Attachment att = new Attachment(reader, encodedAtt.Name, encodedAtt.MediaType);
    return att;            
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top