2012-02-05 59 views
0

我讀過這post版本之間的enumaration更改,但它沒有幫助我。 我有以下WCF服務:wcf向前兼容性使用枚舉

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    MyEnum Foo(); 
} 

[DataContract] 
public enum MyEnum 
{ 
    [EnumMember] 
    first, 
    [EnumMember] 
    Second, 
} 

我正在尋找一種方式將新的枚舉成員,僅添加到服務端。假設我的客戶端使用舊版本的代理服務器,但沒有要添加的新枚舉成員。 我的目標是避免序列化異常,我希望我的客戶足夠聰明來處理這種情況,忽略新的價值或任何東西。有任何想法嗎?

回答

2

根據問題中您所鏈接的答案,向enum添加新元素不會中斷兼容性。

什麼會崩潰發送一個枚舉值的客戶端,在枚舉列表中沒有該值。

爲了僅通過改變服務器端解決此問題:

  • 添加新的價值枚舉
  • 創建一個具有相同的老
  • 新客戶端將使用新的服務新的服務方法
  • 舊客戶將使用舊服務
  • 在舊服務中,在發送結果之前,檢查是否正在使用新的枚舉值之一,如果是,請將其更改爲舊的值之一(「Uknown」如果喲你有這個價值)

這可能是更多的工作比它的價值,這取決於你有多少客戶端和更新它們有多困難。

+0

感謝您的快速回復。 1.我的問題是我已經發布了舊版本,並且我的枚舉中沒有「未知」值,所以我無法將新值更改爲默認值。 2.在最後一個點,你的意思是這個技巧應該發生在WCF的行爲或其他地方? – Sean 2012-02-05 14:20:39

+0

第2點它應該發生在你的代碼中,就在return語句之前。對於第1點,您可以將其更改爲任何現有值?如果舊客戶獲得新的枚舉,那麼應該發生什麼業務規則? – 2012-02-05 14:31:11

+0

如果一位老客戶得到一個新的枚舉,我希望忽略它,或者將它切換到我目前沒有的默認值。 但是這個解決方案帶來了另一個問題 - 一個新客戶端將無法使用舊服務,因爲它將失敗調用'新服務'(舊服務中不存在)。 – Sean 2012-02-05 15:24:35