0

我快疯了,我已经用这个工作了一天多,仍然不知道为什么它不起作用,

我有一个用于发送流的 MessageContract,但出现以下错误,

不需要输入数据合同名称为“FileStream: http://schemas.datacontract.org/2004/07/System.IO ”的“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;}
}

任何帮助都会被大大占用,

4

2 回答 2

0

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

但是,虽然这将消除第一个错误,但您的代码仍然无法工作,因为 FileStreams 不可序列化。

于 2010-07-09T18:42:35.560 回答
0

FileStream 对象指向不能从另一台计算机访问的文件系统。

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

于 2018-09-26T13:43:09.680 回答