3
另請參閱此問題:Can I pass a System.Net.MailMessage to a WCF service?序列化FileStream進行傳輸
我想添加附件到正在發送的郵件。附件是本地光盤上的文件,或動態創建的流。一個WCF合約可以包含一個Stream,但只有當所有參數都是Stream類型。那麼,將一個或多個附件傳遞給WCF服務的最佳方式是什麼?
另請參閱此問題:Can I pass a System.Net.MailMessage to a WCF service?序列化FileStream進行傳輸
我想添加附件到正在發送的郵件。附件是本地光盤上的文件,或動態創建的流。一個WCF合約可以包含一個Stream,但只有當所有參數都是Stream類型。那麼,將一個或多個附件傳遞給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;
}