C# WCF消息契约与流媒体

C# WCF消息契约与流媒体,c#,.net,wcf,stream,messagecontract,C#,.net,Wcf,Stream,Messagecontract,我快疯了,我已经用它工作了一天多了,仍然不知道它为什么不起作用 我有一个MessageContract,我正在使用它发送一个流,但我得到以下错误: 键入带有数据的“System.IO.FileStream” 合同名称 '文件流:' 这是预料不到的。添加任何不需要的类型 静态已知到已知的列表 类型-例如,通过使用 KnownTypeAttribute属性或由 将它们添加到已知类型列表中 传递给DataContractSerializer [ServiceContract()] 公共接口IConte

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

我有一个MessageContract,我正在使用它发送一个流,但我得到以下错误:

键入带有数据的“System.IO.FileStream” 合同名称 '文件流:' 这是预料不到的。添加任何不需要的类型 静态已知到已知的列表 类型-例如,通过使用 KnownTypeAttribute属性或由 将它们添加到已知类型列表中 传递给DataContractSerializer

[ServiceContract()]
公共接口IContentService
{
[OperationContract(),FaultContract(类型为(ContentFault))]
PublishItemResponse PublishFile(PublishFileRequest请求);
}
[MessageContract()]
公共类PublishFileRequest
{ 
[MessageHeader()]
公共文件InventoryItem项{get;set;}
[MessageHeader()]
公共请求请求{get;set;}
[MessageBodyMember()]
公共流文件内容{get;set;}
}
[MessageContract()]
公共类请求
{
[MessageHeader()]
公共Guid授权令牌{get;set;}
[MessageHeader()]
公共字符串CoreVersion{get;set;}
[MessageHeader()]
公共字符串密码{get;set;}
[MessageHeader()]
公共日期时间请求时间{get;set;}
[MessageHeader()]
公共字符串组件版本{get;set;}
[MessageHeader()]
公共字符串用户名{get;set;}
}
[MessageContract()]
[可序列化()]
公共类FileInventoryItem:InventoryItemBase
{
公共流文件内容{get;set;}
}
[MessageContract()]
[知识类型(文件目录项的类型))]
[知识类型(类型(FolderInventoryItem))]
[可序列化()]
公共抽象类InventoryItemBase
{
公共列表错误{get;set;}
公共列表警告{get;set;}
[MessageHeader()]
公共StagingAction动作{get;set;}
[MessageHeader()]
公共字符串ContentXml{get;set;}
[MessageHeader()]
公共int ItemId{get;set;}
[MessageHeader()]
公共ItemType ItemType{{get;set;}
[MessageHeader()]
公共字符串名称{get;set;}
[MessageHeader()]
public int ParentId{get;set;}
[MessageHeader()]
公共Guid ParentUniqueId{get;set;}
[MessageHeader()]
公共Guid唯一ID{get;set;}
[MessageHeader()]
公共Guid版本{get;set;}
}

任何帮助都是非常合适的,

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


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

FileStream对象指向无法从其他计算机访问的文件系统


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

错误提到
System.IO.FileStream
。ServiceContract中没有文件流。为什么?[MessageBodyMember()]公共流文件内容{get;set;}传入的是一个从stream继承的文件流。从stream继承。这就是问题所在。您是否尝试只发送一个纯流以查看它是否工作?无法真正做到这一点,因为stream是一个抽象类型任何最终的解决方案都有完整的源代码示例在工作?文件流不能通过xml序列化程序序列化,它们可以使用messagecontract序列化程序进行序列化。我在一个隔离的环境中获得了一个跨应用程序的文件流,它在特定的设置中似乎不起作用。可能使用DAtacontract而不是messagecontract?
[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;}
}