代码之家  ›  专栏  ›  技术社区  ›  Nathan

使用wcf反序列化客户端上的文件流

  •  1
  • Nathan  · 技术社区  · 14 年前

    我对WCF很陌生,如果我误报了什么,我会提前道歉。

    这是使用.NET 4.0 RC1。

    使用wcf,我试图反序列化服务器的响应。基本响应只有一个流作为其MessageBodyMember。

    public abstract class StreamedResponse
    {
      [MessageBodyMember]
      public Stream Stream { get; set; }
    
      public StreamedResponse()
      {
        this.Stream = Stream.Null;
      }
    }
    

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

    [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()
      {
      }
    }
    

    在我的特定情况下,流总是一个文件流(但不一定总是)。

    起初,wcf说filestream不是一个已知类型,所以我将它添加到已知类型列表中,现在它将序列化。乍一看,它似乎还可以在客户端反序列化它(它是文件流类型)。

    问题是它似乎不可用。所有的canread、canwrite等都是false,length、position等属性在使用时抛出异常。与readbyte()相同。

    我缺少了什么会阻止我获得有效的文件流?

    1 回复  |  直到 14 年前
        1
  •  1
  •   casperOne    14 年前

    简而言之,您无法获取文件流实例。在wcf中,您正在跨应用程序域边界工作(您不必这样做,但它假定您是这样)。因此,无法将文件流序列化为值并跨应用程序域屏障进行传输(文件流是特定于应用程序域的,最明显的原因是它与非托管文件句柄一起工作,这些句柄在当前应用程序域之外没有意义)。

    也就是说,如果您真的需要有关流和内容的信息,那么您可能需要将有关流的信息添加为消息头,然后检索这些头,因为您在两边获得的流实例永远不会是实际的流在呼叫方/被叫方设置的PE。