Question

Voir aussi cette question: Puis-je passer un System.Net.MailMessage à un service WCF?

J'aimerais ajouter des pièces jointes au courrier envoyé. Les pièces jointes sont soit des fichiers sur le disque local, soit des flux créés de manière dynamique. Un contrat WCF peut contenir un Stream, mais uniquement lorsque tous les arguments sont de type Stream. Alors, quel est le meilleur moyen de transmettre une ou plusieurs pièces jointes à un service WCF?

Était-ce utile?

La solution

D'accord, j'ai résolu ce problème moi-même. L'astuce consiste ici à convertir la pièce jointe en une chaîne de codage Base64, de la même manière que les systèmes de messagerie. J'ai créé une classe pour gérer cela. Publié ici pour les autres:

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

Et côté client:

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;            
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top