【问题标题】:Deserializing a FileStream on Client using WCF使用 WCF 反序列化客户端上的 FileStream
【发布时间】:2010-04-05 16:24:52
【问题描述】:

我是 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?

【问题讨论】:

    标签: c# wcf filestream


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-01-08
      • 2020-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多