WCF и интерфейсы по контрактам данных

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

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

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

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

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

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

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

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

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

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

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

  • Ошибка: невозможно получить метаданные из службы WCF
  • Использовать веб-службу WCF с помощью Objective-C на iPhone
  • Передача сложных объектов в службу restа WCF
  • Права доступа WCF ServiceHost
  • Правильный способ связи WSSE Usernametoken для SOAP webservice
  • как создать уникальный токен, срок действия которого истекает через 24 часа?
  • WCF: System.Net.SocketException - разрешено только одно использование каждого адреса сокета (протокол / сетевой адрес / порт)
  • Найти следующий TCP-порт в .Net
  • Эффективный способ отправки изображений через WCF?
  • Возврат сервиса WCF «Метод не разрешен»
  • Клиент службы WCF: текст типа контента / html; charset = utf-8 ответного сообщения не соответствует типу содержимого привязки
  • Давайте будем гением компьютера.