WCF и интерфейсы по контрактам данных - PullRequest
13 голосов
/ 18 января 2011

При создании прокси-сервера WCF с использованием svcutil, можно ли также включать интерфейсы, от которых наследуются контракты данных, например ::100100

public class SomeType: ISometype
{
   public string Name { get; set; }
}

public interface ISometype
{
   public string Name { get; set; }
}

Когда я создаю прокси-сервер с помощью этого, тип SomeType создается на клиенте, но интерфейс не создается, и наследования тоже нет. Я попытался пометить интерфейс как DataContract, но этот атрибут не разрешен.

Можно ли сделать то, что я пытаюсь сделать?

Ответы [ 2 ]

21 голосов
/ 18 января 2011

WCF использует сериализованный обмен сообщениями, и все эти сообщения должны иметь возможность сериализации с использованием DataContractSerializer или XmlSerializer.И эти сообщения, передаваемые между клиентом и сервером, должны быть выражены в XML-схеме.

Теперь XML-схема ничего не знает об интерфейсах - все дело в конкретных, реальных типах.Для обычного сценария, когда вашими клиентами могут быть что угодно, от .NET до PHP, от Ruby до (что угодно), вы должны обязательно выразить все, что вы хотите отправить между клиентом и сервером, таким образом, который может быть представлен в XML-схемах - интерфейсахне могу.Так что на самом деле нет никакого способа поддержать это в сценарии общего назначения.

Если вы управляете обоими концами провода, например пишете и клиент, и сервер, и оба в .NET, тогда вы можетевыполните следующее:

  • поместите ваши DataContracts (и ваши ServiceContracts и OperationContracts и FaultContracts) в отдельную MyServiceContracts сборку

  • , ссылающуюся на эту сборкукак из кода службы, так и из клиента.В этом случае, когда вы собираетесь создать клиентский прокси, упомянутые вами типы уже присутствуют, и WCF с радостью повторно использует эти типы из этой сборки.А поскольку это сборка .NET, на которую вы ссылаетесь, у вас может быть все, что поддерживает .NET, включая интерфейсы.

2 голосов
/ 18 января 2011

Вы можете наследовать от класса, реализующего ISometype, и добавить его в сериализацию, используя атрибут KnownType:

Могу ли я заставить svcutil.exe сгенерировать контракты данных для службы WCF?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...