2010-04-05 89 views
1

我對WCF很陌生,所以如果我錯誤地陳述了某些事情,我很抱歉。使用WCF反序列化客戶端上的FileStream

這是使用.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,字符串等列爲的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() 
    { 
    } 
} 

流是總是一個FileStream,在我的特定情況下(但不總是)。

起初,WCF表示FileStream不是已知類型,所以我將它添加到已知類型的列表中,並且現在它序列化。乍一看,它也出現在客戶端反序列化它(它是FileStream類型)。

的問題是,它似乎並沒有被使用。所有的CanRead,CanWrite等都是錯誤的,而長度,位置等屬性在使用時會引發異常。與ReadByte()一樣。

我錯過了什麼讓我無法獲得有效的FileStream?

回答

1

簡短的回答是,你不能讓一個FileStream實例。在WCF中,您正在跨應用程序域邊界工作(您不必這樣做,但假設您是)。正因爲如此,你不能序列化一個FileStream成價值,在應用程序域屏障轉運它(的FileStream爲應用程序域特有的,最主要的是因爲它與非託管的文件句柄的作品不具有的意義之外當前的應用程序域)。這就是說,如果你真的需要關於流和內容的信息,那麼你可能會想要添加關於流的信息作爲消息頭,然後檢索這些頭,因爲你得到的Stream實例在任何一方將永遠不會是在調用/被調用端設置的實際流類型。