2009-01-16 5 views
3

Voir aussi cette question: Can I pass a System.Net.MailMessage to a WCF service?SERIALIZE un FileStream pour le transport

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

Répondre

8

D'accord, j'ai résolu cela moi-même. L'astuce ici est de convertir la pièce jointe en une chaîne de caractères encodée en Base64, de la même manière que les systèmes de messagerie le font. J'ai créé une classe pour gérer cela. Publié ici pour d'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 sur le 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;    
} 
Questions connexes