0

私はボーダーラインに夢中になっています.1日以上これを使っていますが、なぜうまくいかないのかまだわかりません.

ストリームを送信するために使用している 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 クラスに追加します)。

ただし、これで最初のエラーは解消されますが、FileStream はシリアル化できないため、コードは機能しません。

于 2010-07-09T18:42:35.560 に答える