WCF消息合同和流

时间:2010-07-08 23:44:59

标签: c# .net wcf stream messagecontract

我疯狂地走线,我已经用了一天以上了,但仍然不知道它为什么不起作用,

我有一个我用来发送流的MessageContract,但是我收到以下错误,

  

输入带有数据的'System.IO.FileStream'   合同名称   '的FileStream:http://schemas.datacontract.org/2004/07/System.IO'   不是预期的。不添加任何类型   静态地知道已知的名单   类型 - 例如,通过使用   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;}
}

任何帮助都非常合适,

2 个答案:

答案 0 :(得分:0)

WCF要求序列化的类型与合同中声明的类型完全匹配。您可以通过添加KnownType属性来表明您知道将要使用的特定子类型(在这种情况下,您将其添加到PublishFileRequest类)。

但是,虽然这样可以消除第一个错误,但由于FileStreams不可序列化,因此您的代码仍然无效。

答案 1 :(得分:0)

FileStream对象指向文件系统,该文件系统无法从另一台计算机访问。

改用MemoryStream传输数据。您可以使用Stream.CopyTo(memoryStream)将数据复制到MemoryStream对象。