2012-01-11 51 views
9

TLDR:如何創建WCF服務,這是向後兼容 - 那就是,當我部署在服務器端的服務的新版本,在舊版本的所有客戶端可以仍在使用該服務。製作向後兼容WCF服務


我創建一個Web服務,將允許客戶端應用程序獲取插件的列表。我將至少有一個操作,如FindPlugins(string nameOrDescription)這將在服務器上進行搜索並返回一個對象列表。

不幸的是,我不能保證我的客戶將全部更新我的服務的每個新版本;不知道,我是當然,他們中的很多人會跟蹤最新版本,並且會有舊版本 - 多大年紀,我不能確定,但​​我知道他們會老了:)

如果我創建新的服務操作,更改模式或者在服務器端進行某種中斷操作,我就完成了。我需要隨時設計向後兼容性。

下面是一個例子。假設我返回了一個名爲Plugin的列表,每個列表都有一個名稱和說明,並且我部署了我的服務的v0.1。然後,我添加一個下載鏈接,並將其部署爲我的服務的v0.2。


,我看到一些選項是:

  • 強制客戶端更新到最新的服務(行不通)
  • 打破老客戶服務(行不通)
  • 附加一個版本號,並且僅使用版本特定的操作(例如,FindPluginsV1,FindPluginsV2) - 對於多個操作似乎不實用
  • 提供與每個新版本的新服務 - 似乎並不實用
+0

您的需求是否可以通過添加更多服務操作來滿足? – 2012-01-11 22:18:23

+0

@hugh是的,就像我剛纔提到的那樣,我可以在每個操作上粘貼一個服務號碼(例如v1);或者通過擁有不同的服務(例如V1Service,v2Service)。但由於重複/維護,我不喜歡這種方法。 – ashes999 2012-01-11 22:47:55

回答

0

如果你看一下這篇文章http://blogs.msdn.com/b/craigmcmurtry/archive/2006/07/23/676104.aspx

第一個例子的傢伙給將滿足您的要求。它具有現有客戶不會中斷的優點,並且您可以按照您的方式添加儘可能多的新服務操作。

[ServiceContract] 
public interface IMyServiceContract 
{  
    [OperationContract(IsOneWay=true)]  
    public void MyMethod(MyDataContract input); 
} 

[ServiceContract] 
public interface IMyAugmentedServiceContract: IMyServiceContract 
{  
    [OperationContract(IsOneWay=true)]  
    public void MyNewMethod(MyOtherDataContract input); 
} 

改變您的服務實現:

public class MyOriginalServiceType: IAugmentedServiceContract { } 
9

WCF是默認的向後兼容。

下面的MSDN鏈接中包含的WCF合同的所有可能的變化的列表,並描述了他們對老客戶的影響:

最重要的,下面的操作將不是導致老客戶中斷:

服務合同(方法)

  • 添加方法參數:默認值將在從舊客戶端調用時使用。
  • 移除方法參數:舊客戶端發送的值將被無提示地忽略。
  • 添加新方法:顯然,老客戶不會打電話給他們,因爲他們不知道他們。

數據合同(用於傳遞數據的自定義類)

  • 添加非必需的性質。
  • 刪除不需要的屬性。

因此,除非您將新DownloadLink領域爲IsRequired(默認爲),你的變化應該罰款。