WCF, определяющий интерфейсный контракт в WSDL - PullRequest
0 голосов
/ 21 марта 2012

Я создаю концептуальный сервис WCF и намеренно строю все интерфейсы, чтобы избежать необходимости в какой-либо конкретной реализации.Я хотел бы отправить полученный контракт (включая определения сообщений) другой команде, чтобы начать сборку на основе контракта, который я строю, но параметры сообщения не сериализуются, если я не предоставлю класс, украшенный DataContractAttribute.Есть ли способ для меня продолжать использовать слабосвязанные интерфейсы для определения моего контракта или мне нужно вместо этого создавать все мои сообщения, используя классы?

Пример службы

[ServiceContract]
public interface ITestService
{
  [OperationContract]
  ITestResponse TestOperation(ITestRequest request);
}

public interface ITestRequest
{
  string Message { get; set; }
}

public interface ITestResponse
{
  bool Success { get; set; }
}

Пример определения XSD

<xs:element name="TestOperation">
  <xs:complexType>
    <xs:sequence>
      <!--I want this to be a reference to a complex type with definition of it's members-->
      <xs:element minOccurs="0" name="result" nillable="true" type="xs:anyType"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

1 Ответ

0 голосов
/ 21 марта 2012

Короткий ответ: вы должны использовать тип, который реализует интерфейс, а не сам интерфейс. Как вы, вероятно, узнали, вы не можете использовать DataContract для интерфейса.

Сериализатор WCF был разработан для использования конкретных типов, потому что он должен переводить их в типы на основе XML-схемы. Схема XML не имеет понятия «интерфейс», как это определено в языках .NET. Стандарт мыла описывает «типы» в WSDL с использованием схемы XML, поэтому они могут использоваться любым клиентом, написанным на любом языке, который «знает», как преобразовать XSD в соответствующие конструкции для этого языка.

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