2011-11-26 96 views
3

我有一個案例,我有一個Web服務客戶端作爲更大的產品的一部分。這裏的角色有點相反:客戶端是託管Web服務的客戶端,我們的應用程序就是那些使用它們的應用程序。是否可以使用.NET Web服務客戶端支持同一Web服務的多個不同版本?

客戶端目前全部運行這些Web服務的一個版本(最初也由我們構建)。藉助這一新產品,我們提供的Web服務堆棧將擴展爲新功能;客戶可以安裝這個新的堆棧,如果他們想訪問新的功能。

但是 - 一個關鍵要求是向後兼容性。 (可能很重要) - 我們在我們自己的服務器上安裝了一箇中央安裝的網頁軟件;我們所有的客戶都通過我們的服務器僅通過我們的服務器使用我們的系統;另一方面,客戶端的系統託管由他們單獨進行 - 他們都有自己的產品安裝,我們與這些產品集成(並將我們的Web服務作爲附加組件安裝到這些產品中)。因此,項目的這個新版本應該理想地檢測給定客戶端正在使用的Web服務堆棧的兩個版本中的哪一個(給定WSDL的URL和任何其他相關信息),並使用適當的Web服務客戶端進行通信。理想情況下,URL應該是相同的(即「www.exampleCompany22.com/MyCompanyWebService/」可以運行版本1,「www.exampleCompany88.com/MyCompanyWebService/」可以運行版本2)。我們應該能夠檢測到他們正在使用的版本,並使用適當的代碼對付它。

我們可以控制我們的系統,並且可以控制第2版(未來,第二版Web服務),但不是現有版本1(客戶端已經安裝並且可以選擇不升級選擇)。

是否有任何內置的功能(或任何庫,或任何其他直接的方式)在.NET中實現這個沒有任何解決方法?

我不認爲這應該是太難了,但這可能不是太 常見的情況...而絕對不是我遇到的。

我可以想出幾種方法來解決手邊的問題;但我想知道是否有一種實際的「正確」方式來做到這一點(或者如果某人之前有過類似的情況,並且可以就他們如何實施這些方面提供反饋)。

回答

1

有多種方法可以解決這個問題,其中一些方法取決於您的Web服務的工作方式。

一種方法是客戶端安裝的一部分是調用您的服務器以通知他們使用哪個版本。在您呼叫客戶端之前,您需要檢查內部表格以確定版本號,然後採取適當的措施。

第二種方法是將版本號添加到您在客戶端站點上安裝的每個服務文件。例如:OurService20.asmxOurService30.asmx。除此之外,您還將擁有一個名爲GetVersion.asmx的標準服務文件,它返回了您可以使用的最新版本。

另一種方法是完全轉儲WSDL和ASMX服務,並轉到RESTful體系結構,其中保留完全相同的命名機制,即:OurService.ashx注意分機的區別。使用這種方法,您可以執行http GET,如http://remoteclient/OurService.ashx?getVersion並解析響應。從那時起,你就可以確切地知道他們安裝了哪個版本。

就我個人而言,我喜歡RESTful路線,因爲它爲您提供了更多的靈活性,同時也讓您的應用程序更容易被其他應用程序使用。

+0

將此信息保存在數據庫中實際上不是一個壞主意......但是,它可能無法在我們的案例中實現。完整的背景是我們的客戶正在使用他們安裝和託管自己的Java企業應用程序;我們爲這個應用程序提供了附件(用Java編寫的Web服務),客戶可以安裝這些附件,以便我們的系統可以與他們進行通信;因此,它不需要公開(它只能與我們的系統通信)。這些版本的問題在於,我採取這一路線的全部理由是,我想讓客戶 – Ruslan

+0

選擇不升級並保持其設置的方式。我們的系統應該在他們的最後調用我們的「插件」,檢測他們正在使用的版本,並與兩者一起工作......但我真的很感謝你的答案;這非常有用,讓我思考。 – Ruslan