2010-07-08 90 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