序列化 FileStream 以进行传输
Posted
技术标签:
【中文标题】序列化 FileStream 以进行传输【英文标题】:Serialize a FileStream for transport 【发布时间】:2010-10-01 18:57:59 【问题描述】:另请参阅此问题:Can I pass a System.Net.MailMessage to a WCF service?
我想在发送的邮件中添加附件。附件可以是本地磁盘上的文件,也可以是动态创建的流。 WCF 协定可以包含 Stream,但仅当所有参数都是 Stream 类型时。那么,将一个或多个附件传递给 WCF 服务的最佳方式是什么?
【问题讨论】:
【参考方案1】:好的,我自己解决了这个问题。这里的技巧是将附件转换为 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;
【讨论】:
以上是关于序列化 FileStream 以进行传输的主要内容,如果未能解决你的问题,请参考以下文章
FileStream.Seek() 是不是通过网络传输数据?
(12)C#传智:File类,泛型,字典,FileStream,StreamReader,多态
File.Copy 与手动 FileStream.Write 用于复制文件