2014-04-17 80 views
1

我們已經通過一定的DataContract和SerivceContract向生產交付了WCF服務。 但是現在我們需要稍微改變一下SerivceContract和DataContract。我們的一位消費者無法更新合同。但我們需要在同一地址上支持舊客戶端和新客戶端。怎麼做?WCF中DataContract/ServiceContract的構造

舊合約:

[ServiceContract] 
public interface ICoolerService 
{ 
    [OperationContract] 
    IEnumerable<Cooler> Get(IEnumerable<int> ids) 
} 

新合同:

[ServiceContract] 
public interface ICoolerService 
{ 
    [OperationContract] 
    IEnumerable<Cooler> Get(IEnumerable<CoolerRequest> req) 
} 

[DataContract] 
public class CoolerRequest 
{ 
    [DataMember] 
    public int Id { get; set; } 
    //and some more properties 
} 

請指教如何支持在相同的URI兩份合同。

+0

其中一個方法是使方法,該方法返回的版本合同。如果比在客戶端保存的更新,則自動將新引用的更新下載到客戶端。我們使用這個和它的工作完美。每個客戶都有實際的版本。 – Musketyr

+0

不幸的是,我們還沒有訪問客戶端代碼:( –

+0

因此,這是不可能的。如果您在服務器端更改合同並且想要在客戶端使用更改,則必須更新客戶端上的引用。 – Musketyr

回答

0

難道你不能離開舊的過載嗎?

[ServiceContract] 
public interface ICoolerService 
{ 
    [OperationContract] 
    IEnumerable<Cooler> Get(IEnumerable<int> ids); 

    [OperationContract] 
    IEnumerable<Cooler> Get(IEnumerable<CoolerRequest> req); 
} 
+0

謝謝,讓我試試 –

+0

這不行,它會編譯,但是會在運行時拋出一個異常,當調用該操作契約時 – CathalMF

+0

它不起作用,不幸的是,當服務啓動時,我有一個例外:不能有兩個在具有相同名稱的同一合同中執行操作,方法Get和Get中的CoolerService.ICoolerService類型違反了此規則。您可以通過更改方法名稱或使用OperationContractAttribute的Name屬性更改其中一個操作的名稱。 –