7

クライアントが WSDL を更新する必要なく、新しい (オプションの) パラメータを既存の操作に追加するのに最適な方法は何ですか? サービス コントラクトの新しいバージョンを記述するために名前空間を更新したくありません。これは古いクライアントとの下位互換性があるはずだからです。

オーバーロードとして、新しいパラメーターを使用して新しい操作を追加する必要がありますか? それとも、既存の操作にパラメーターを追加するだけですか?

これが私の操作です:

[OperationContract]
MyResponse GetData();

それは次のとおりです。

[OperationContract]
MyResponse GetData(); 

[OperationContract]
MyResponse GetData(string filter);

またはもっと簡単に、これを次のように変更します。

[OperationContract]
MyResponse GetData(string filter);

後者のオプションが最適と思われ、私の参考書によると、「クライアントへの影響はありません。新しいパラメーターはサービスでデフォルト値に初期化されます。WCF はそれをいわゆるデフォルト値に初期化していますか?」もしそうなら、デフォルト値は何ですか?

4

3 に答える 3

14

考慮すべきことの1つは、同じ名前のOperationContractを2つ持つことはできないということです。シリアル化された方法では、エラーがスローされます。

最善のアプローチは、オプション3(新しいパラメーターを追加するだけ)を使用し、メソッドロジックアカウント内で、まだ更新されていないクライアントのnull値であることを確認することです。クライアントが更新する必要がある重大な変更である場合は、例外のためにアプリケーション全体が停止しないようにしてください。

于 2009-11-17T22:10:54.387 に答える
4

使用後に既存の契約を変更することは、サービス指向のすべてのルールに反します。既存の契約を破ってはいけません。

実際には、これは非常に頻繁に発生し、WCFはそれを処理するのに非常に優れています。重大な変更のみを導入する限り、既存のクライアントは引き続き機能します。

これは次のようになります。

  • 既存のサービス契約に対する新しい運用契約
  • DataContractの新しい必須ではないフィールド

あなたがやろうとしていることはうまくいきませんが

  1. WCFで同じ名前の2つのメソッドを使用することはできません-WCFは.NETではなく、同じ名前の2つのメソッドを署名のみが異なるものにすることはできません。動作しません。2つの別個の異なる名前を使用する必要があります。注意:WCFメソッド呼び出しは、サービスを説明するためにWSDL(Webサービス記述言語)ドキュメントに変換されます-WSDLは、同じ名前の2つの操作を持つことを単にサポートしていません-署名の違いだけがサポートされておらず、機能しません。

  2. 既存のコントラクトを変更することはできません。たとえば、コントラクトを解除せずに、事後にメソッド呼び出しに新しいパラメータを導入することはできません。

だからあなたが本当にする必要があるのはこれです:

[OperationContract]
MyResponse GetData(); 

[OperationContract]
MyResponse GetFilteredData(string filter);

あなたが提案した他の変更は、a)契約を破る、またはb)単にWCFで機能しない:

于 2009-11-17T22:09:51.120 に答える
3

あなたはこれを試すことができます:

[OperationContract]
MyResponse GetData(); 

[OperationContract(Name = "GetDataByFilter")]
MyResponse GetData(string filter);
于 2010-10-13T18:59:25.480 に答える