次のような運用契約がある場合:
[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について私が気に入っていることの1つは、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について私が気に入っていることの1つは、IsRequired、Order、およびNameを定義できることです。
今日、私は唯一の消費者がWCFクライアントになることを期待しています。ただし、最初に契約を設計し、SOAの慣行を可能な限り遵守したいと思います。WCFにSOAP、WSDL、およびXSDを指示させるのではなく、XMLでWCFレイヤーを定義する必要がありますが、カスタムメッセージ処理をWCFに追加しないように、WCFを使用してこれを生成します。おそらくすべてのタグが小文字で始まると思われる最も一般的なSOAXML規則に従いたいのですが、正しいですか?そして、私は可能な限りバージョントレラントになりたいと思っています。
常にこのような要求メッセージと応答メッセージを作成するのが賢明ですか?3つのフォーマットのどれがベストSOAプラクティスを促進しますか?さらに一歩進んで、DataContractとMessageContractの両方を定義し、MessageContractにDataContractのみが含まれるようにする必要がありますか?または、本当に新しいタイプを公開している場合(つまり、メッセージタイプをコンテナーとして作成しない場合)にのみDataContractsを使用する必要がありますか?
たくさんの質問がありますが、その核心をつかもうとしています。質問を分離することで、探している答えを得るのに十分なコンテキストが得られるかどうかはわかりません。