2009-05-29 24 views
8

私はSOAP Webサービス(ASP.NETバージョン2.0)を維持しており、特定のメソッドの戻り値を変更するいくつかの変更を加えなければなりません。ASP.NET 2.0 Webサービスをバージョンアップする最も良い方法は何ですか?

既存の実装を破ることなくこれを行う一般的に認められている方法は何ですか?

私の最初の考えは、以下のすべてが可能であるということです。

a)既存のWebサービス内に新しいバージョン固有のメソッドを提供します。 getPerson_v1.4
b).asmxファイルの完全なコピーに新しいバージョン番号を指定します。 http:/www.example.com/AdminWS_V1_4.asmx。これは、サービスが50以上のメソッドを持ち、2/3メソッドへの変更のためのコードをコピーするとコードが重複しているように思えるので、私が気に入っているアイディアではありません。
c)Webサービスコンストラクタをオーバーライドして、バージョン番号を渡すことができます。これはうまくいかないようですが、リフレクションではWSDL内でどのように表現されるかわかりません。

一般的に受け入れられている方法がありますか、この分野の経験に基づいてアドバイスを受けていますか?

答えて

6

一般的には、バージョン管理メソッド名と.asmxファイル名だけではなく、Webサービスのバージョン管理がますます増えています。理想的には、Webサービス(そのWSDL)へのインタフェースは永続的な契約でなければならず、決して変更するべきではありません。変更された機能を必要としないクライアントは決して変更する必要がないため、再テストする必要はありません。

既存の契約を破る代わりに、変更された操作を含む新しい契約を作成する必要があります。その契約は既存の契約から「継承」することができます。つまり、「最後にメソッドを追加する」ことができます。ただし、新しい契約を新しいXML名前空間に入れる必要があります。名前空間は基本的にWSDLを識別し、名前空間をkepingしますが、WSDLを変更することは嘘です。

この新しい契約は、新しいエンドポイント(.asmxファイル)で実装する必要があります。これが別のディレクトリにあるのか、別のWebサイトにあるのかはまったく関係ありません。重要な点は、新しい機能を必要とするクライアントは、新しいURLで新しいWSDLを参照し、その新しいURLで新しいサービスを呼び出し、満足できることです。

既存の契約を変更する効果の1つは、次回に「Web参照の更新」を実行するときに、がクライアントプロキシクラスのコードに変更されることに注意してください。ほとんどのお店では、コードを変更するには再テストと再デプロイが必要です。したがって、既存のクライアントコードが新しいメソッドを使用していなくても、単に「メソッドを追加する」ことを「テストして配備する必要のあるクライアントコードを追加する」と考えるべきです。

7

私たちは、たとえば、バージョンディレクトリに展開:

http://www.example.com/soap/v1/ ​​ http://www.example.com/soap/v3/

など

+0

これは良い方法だと思うし、多くの組織がこの方法を使用しています。これは、ユーザーが異なるバージョンのサービスにアクセスしていることを明確に示しています。 – BobbyShaftoe

+0

私はそれを合理的なオプションのように思えますが、Webサービスは他のコードを使用していますが、私たちの既存のユーザーはすべて「メイン」サイトを参照しています(つまり、バージョンなし) –

+0

@Steve Weetは、この例を続け、directoy alaを作成することで解決できないだろうか:http://www.example.com/soap/current/ - これは最新のバージョンにマップするだけだろうか?メソッドにバージョン番号を付けると、すべての履歴に興味のない新しいユーザーのためにAPIが複雑になります。 – Thies

0

あなたがそれぞれの新しいバージョンでメソッドのシグネチャのほとんどを変更しない限り、私は行くだろう(a) - バージョン管理されたメソッド名。これは私たちのプロバイダがそれを行う方法であり、それは私たちのためにうまくいきます。

2

私はちょうどきれいに見える別の解決策を考えました。

SOAPヘッダーに含まれているバージョン番号を確認し、提供されていない場合は既存のバージョン番号を引き継ぐことができます。

これで、メソッドのシグネチャを変更せずに、異なるバージョンのコードの動作が異なるようにすることができます。これは、Webサービスからの戻り値がXMLオブジェクトであるため、メソッドのシグネチャは変わりませんが、XMLの内容はバージョンに基づいて変更される可能性があります。

+0

私は個人的にはヘッダーに実際に契約の中にあるべきものを隠しているので、このアプローチの大きなファンではありません。あなたが行っている変更は、古い呼び出し元の契約に影響を与えません(古い呼び出し元が理解できない部分を無視するような方法でデータを返すことができます)か、契約に影響します。契約に影響を与えている場合は、その事実を宣言することについて明示する必要があります(IMO)。 – sfitts

2

開発中のWebサービスで同じバージョン管理の問題があります。私たちは、ユーザがヘッダーにスキーマバージョン番号を渡すようにします。彼らは、XMLスキーマのどのバージョンを元に戻すかを教えてくれます。この方法では、私たちは常に下位互換性があり、コードは重複しません。

私の仕事では、WebサービスをバージョンアップするときにURLをWebサービスに切り替える必要があるとクライアントに伝えることはできません。大企業では、URLのような小さな変更は何ヶ月ものテストにかかります。あなたのクライアント接続を破ってはいけないというのは私の気持ちです。私たちがしていることは、最新バージョンに新しい機能を追加することです。クライアントが新しい機能を求めたときに、必要に応じて最新のスキーマにアップグレードする必要があります。

関連する問題