سؤال

وانظر أيضا هذا السؤال: هل يمكنني تمرير System.Net.MailMessage إلى خدمة WCF؟

وأود لإضافة مرفقات إلى البريد التي يتم إرسالها. المرفقات هي إما الملفات على القرص المحلي، أو إنشاؤه بشكل حيوي تيارات. يمكن أن يتضمن عقد WCF على تيار، ولكن فقط عندما تكون جميع الحجج هي من نوع تيار. لذا، ما هو أفضل وسيلة لتمرير واحد أو أكثر من المرفقات إلى خدمة WCF؟

هل كانت مفيدة؟

المحلول

وحسنا لقد حل هذا بنفسي. الخدعة هنا هو لتحويل المرفق إلى base64 في بترميز سلسلة، والكثير من أنظمة البريد الإلكتروني بنفس الطريقة القيام بذلك. لقد خلق فئة للتعامل مع هذا. نشرت هنا للآخرين:

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

وعلى جانب العميل:

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;            
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top