2010-07-08 57 views
0

我要去邊界線瘋了,我一直在使用這超過了一天,仍然不知道爲什麼它不工作,WCF消息協定和流

我有一個MessageContract我是預計不會 :採用送出去一個流,但我得到以下錯誤,

類型「System.IO.FileStream」與數據 合同名稱 「http://schemas.datacontract.org/2004/07/System.IO的FileStream」。將已知靜態的 類型添加到已知的 類型的列表中 - 例如,使用 KnownTypeAttribute屬性或 將它們添加到傳遞給DataContractSerializer的已知類型列表 。

[ServiceContract()] 
public interface IContentService 
{ 
    [OperationContract(), FaultContract(typeof(ContentFault))] 
    PublishItemResponse PublishFile(PublishFileRequest request); 
} 


[MessageContract()] 
public class PublishFileRequest 
{ 
[MessageHeader()] 
public FileInventoryItem Item {get;set;} 

[MessageHeader()] 
public Request Request {get;set;} 

[MessageBodyMember()] 
public Stream FileContent {get;set;} 
} 



[MessageContract()] 
public class Request 
{ 
    [MessageHeader()] 
    public Guid AuthorizationToken { get; set; } 

    [MessageHeader()] 
    public string CoreVersion { get; set; } 

    [MessageHeader()] 
    public string Password { get; set; } 

    [MessageHeader()] 
    public DateTime RequestTime { get; set; } 

    [MessageHeader()] 
    public string ComponentVersion { get; set; } 

    [MessageHeader()] 
    public string UserName { get; set; } 
} 



[MessageContract()] 
[Serializable()] 
public class FileInventoryItem : InventoryItemBase 
{ 
public Stream FileContent { get; set;} 
} 



[MessageContract()] 
[KnownType(typeof(FileInventoryItem))] 
[KnownType(typeof(FolderInventoryItem))] 
[Serializable()] 
public abstract class InventoryItemBase 
{ 
public List<string> Errors {get;set;} 

public List<string> Warnings {get;set;} 

[MessageHeader()] 
public StagingAction Action {get;set;} 

[MessageHeader()] 
public string ContentXml {get;set;} 

[MessageHeader()] 
public int ItemId {get;set;} 

[MessageHeader()] 
public ItemType ItemType { {get;set;} 

[MessageHeader()] 
public string Name {get;set;} 

[MessageHeader()] 
public int ParentId {get;set;} 

[MessageHeader()] 
public Guid ParentUniqueId {get;set;} 

[MessageHeader()] 
public Guid UniqueId {get;set;} 

[MessageHeader()] 
public Guid Version {get;set;} 
} 

任何幫助是極大挪用,

+0

錯誤提到'System.IO.FileStream'。 ServiceContract中沒有FileStream。爲什麼? – 2010-07-09 00:01:32

+0

[MessageBodyMember()] public Stream FileContent {get; set;} 正在傳入的是從Stream繼承的File-stream。 – 2010-07-09 00:08:09

+0

*從Stream繼承*。那就是問題所在。你是否試圖發送一個純粹的流,看看它是否有效? – 2010-07-09 00:18:25

回答

0

WCF需要被序列化到完全匹配在合同中聲明的類型的類型。您可以通過添加KnownType屬性來解決該問題,以表明您知道將使用特定的子類型(在這種情況下,您將其添加到PublishFileRequest類中)。

但是,雖然這將消除第一個錯誤,但由於FileStreams不可序列化,因此您的代碼仍然無法工作。

+0

文件流不能通過xml serilizer進行序列化,它們可以使用messagecontract serilizer進行serilizable。我在一個孤立的環境中跨應用程序獲得了一個FileStream,但它似乎並不適用於特定的設置。 – 2010-07-11 23:02:56

+0

也許使用DAtacontract而不是messagecontract? – Kiquenet 2013-06-07 11:36:32