【问题标题】:WCF Message Contract and StreamingWCF 消息契约和流式处理
【发布时间】:2011-03-13 15:20:24
【问题描述】:

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

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

键入带有数据的“System.IO.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;}
}

任何帮助都非常适合,

【问题讨论】:

  • 错误提到System.IO.FileStream。您的 ServiceContract 中没有 FileStream。为什么?
  • [MessageBodyMember()] public Stream FileContent {get;set;} 传入的是从 Stream 继承的 File-stream。
  • 从 Stream 继承。那就是问题所在。您是否尝试过仅发送一个纯 Stream 以查看它是否有效?
  • 不能真正做到这一点,因为 Stream 是一种抽象类型
  • 任何带有完整源代码示例的最终解决方案?

标签: c# .net wcf stream messagecontract


【解决方案1】:

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

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

【讨论】:

  • 文件流不能被 xml 序列化器序列化,它们可以使用 messagecontract 序列化器序列化。我在一个隔离的环境中获得了跨应用程序的 FileStream,它似乎在该特定设置中不起作用。
  • 也许使用 DAtacontract 而不是 messagecontract ?
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2013-04-27
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多