Контракт сообщения WCF и потоковая передача - PullRequest
0 голосов
/ 09 июля 2010

Я схожу с ума от границы, я работаю с этим более дня и до сих пор не знаю, почему это не работает,

У меня есть 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 голосов
/ 26 сентября 2018

Объект FileStream указывает на файловую систему, к которой нельзя получить доступ с другого компьютера.

Вместо этого используйте MemoryStream для передачи данных. Вы можете использовать Stream.CopyTo (memoryStream) для копирования данных в объект MemoryStream.

0 голосов
/ 09 июля 2010

WCF требует, чтобы сериализованные типы точно соответствовали типам, объявленным в контракте. Это можно обойти, добавив атрибут KnownType , чтобы указать, что вы знаете, что будет использоваться определенный подтип (в этом случае вы добавите его в класс PublishFileRequest).

Однако, хотя это устранит первую ошибку, ваш код все равно не будет работать, поскольку FileStreams не сериализуемы.

...