С учетом рабочего договора, например:
[OperationContract]
void Operation(string param1, string param2, int param3);
Это может быть изменено на:
[MessageContract]
public class OperationRequest
{
[MessageBodyMember]
public string Param1 { get; set; }
[MessageBodyMember]
public string Param2 { get; set; }
[MessageBodyMember]
public int Param3 { get; set; }
}
[MessageContract]
public class OperationResponse
{
}
[OperationContract]
OperationResponse Operation(OperationRequest request);
Одна вещь, которая мне нравится в MessageContract, заключается в том, что я получаю немного более явный контроль над форматом сообщения SOAP.
Аналогично, я мог бы написать почти тот же код, но использовать DataContract:
[DataContract]
public class OperationRequest
{
[DataMember]
public string Param1 { get; set; }
[DataMember]
public string Param2 { get; set; }
[DataMember]
public int Param3 { get; set; }
}
[DataContract]
public class OperationResponse
{
}
[OperationContract]
OperationResponse Operation(OperationRequest request);
Мне нравится в DataContract, что я могу определить IsRequired, Order и Name.
Сегодня я ожидаю, что единственным клиентом будет WCF-клиент. Тем не менее, я хочу сначала разработать контракт и придерживаться практики SOA как можно больше. Вместо того, чтобы WCF диктует мои SOAP, WSDL и XSD, я хочу, чтобы XML определял уровень WCF, но используйте WCF для его создания, чтобы не добавлять какую-либо обработку пользовательских сообщений в WCF. Я хочу следовать наиболее распространенным соглашениям XML SOA, которые, я считаю, вероятно, являются тегами, начинающимися в нижнем регистре - я прав? И я хочу быть максимально толерантным к версии.
Можно ли всегда создавать сообщения "Запрос" и "Ответ" как это? Какой из трех форматов способствует лучшей практике SOA? Должен ли я идти еще дальше и определять как DataContract, так и MessageContract, в которых MessageContract содержит только DataContract? Или я должен использовать DataContracts когда-либо, если я действительно раскрываю новый тип (т.е. Не создавайте типы сообщений в качестве контейнеров)?
Загруженный набор вопросов, которые я знаю, но я пытаюсь понять его суть, и я не уверен, что разделение вопросов дает достаточный контекст для получения ответа, который я ищу.