我对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?
答案 0 :(得分:1)
简短的回答是你无法获得FileStream实例。在WCF中,您正在跨应用程序域边界工作(您不必这样做,但假设您是这样)。因此,您无法将FileStream序列化为值并将其传输到app-domain屏障(FileStream是特定于应用程序域的,最显着的是因为它适用于非托管文件句柄,这些句柄之外没有任何意义当前的app-domain)。
话虽如此,如果您确实需要有关流的信息以及内容,那么您可能希望将有关流的信息添加为消息头,然后检索这些头,作为您获得的Stream实例任何一方都不会是在主叫/被叫方面设置的实际流类型。