使用WCF在客户端上反序列化FileStream

时间:2010-04-05 16:24:52

标签: c# wcf filestream

我对WCF很新,所以如果我错误的话,我会提前道歉。

这是使用.NET 4.0 RC1。

使用WCF,我试图反序列化来自服务器的响应。基本响应将Stream作为其唯一的MessageBodyMember。

public abstract class StreamedResponse
{
  [MessageBodyMember]
  public Stream Stream { get; set; }

  public StreamedResponse()
  {
    this.Stream = Stream.Null;
  }
}

此类的派生版本实际上是序列化的,但它们没有MessageBodyMember属性(它们还有其他基类型,如int,string等列为MessageHeader值)。

[MessageContract]
public class ChildResponse : StreamedResponse
{
  [DataMember]
  [MessageHeader]
  public Guid ID { get; set; }

  [DataMember]
  [MessageHeader]
  public string FileName { get; set; }

  [DataMember]
  [MessageHeader]
  public long FileSize { get; set; }

  public ChildResponse() : base()
  {
  }
}

在我的特定情况下,Stream总是一个FileStream(但可能并不总是如此)。

起初,WCF说FileStream不是已知的类型,所以我将它添加到已知类型的列表中,现在它已经序列化了。乍一看,它似乎也会在客户端进行反序列化(它是FileStream类型)。

问题在于它似乎不可用。所有CanRead,CanWrite等都是false,并且Length,Position等属性在使用时会抛出异常。与ReadByte()相同。

我错过了什么会阻止我获得有效的FileStream?

1 个答案:

答案 0 :(得分:1)

简短的回答是你无法获得FileStream实例。在WCF中,您正在跨应用程序域边界工作(您不必这样做,但假设您是这样)。因此,您无法将FileStream序列化为值并将其传输到app-domain屏障(FileStream是特定于应用程序域的,最显着的是因为它适用于非托管文件句柄,这些句柄之外没有任何意义当前的app-domain)。

话虽如此,如果您确实需要有关流的信息以及内容,那么您可能希望将有关流的信息添加为消息头,然后检索这些头,作为您获得的Stream实例任何一方都不会是在主叫/被叫方面设置的实际流类型。