2014-09-18 71 views
0

我有這樣一個服務器端DataContractWCF DataContract等價混亂

[DataContract(Name = "CommonType", Namespace = "http://mycompany.com/2014/09/DataService")] 
public class CompositeType 
{ 
    bool boolValue = true; 
    string stringValue = "Hello "; 

    [DataMember(Name="Property1")] 
    public bool BoolValue 
    { 
     get { return boolValue; } 
     set { boolValue = value; } 
    } 

    [DataMember(Name = "Property2")] 
    public string StringValue 
    { 
     get { return stringValue; } 
     set { stringValue = value; } 
    } 
} 

服務器端的類名是CompositeType具有指定DataContract名稱和命名空間。

客戶端類看起來是這樣的:

[DataContract(Name = "CommonType", Namespace = "http://mycompany.com/2014/09/DataService")] 
public class ClientType 
{ 
    bool boolValue; 
    string stringValue; 

    [DataMember(Name = "Property1")] 
    public bool ClientBoolValue 
    { 
     get { return boolValue; } 
     set { boolValue = value; } 
    } 

    [DataMember(Name = "Property2")] 
    public string ClientStringValue 
    { 
     get { return stringValue; } 
     set { stringValue = value; } 
    } 
} 

客戶端類是不同的類型,但相同的DataContract名稱和命名空間。

的的ServiceContract看起來是這樣的:

[ServiceContract] 
public interface IService1 
{ 
    [OperationContract] 
    CompositeType GetDataUsingDataContract(CompositeType composite); 

} 

的實施過程是這樣:

public class Service1 : AES.Services.Data.IService1 
{ 
    public AES.Services.Data.CompositeType GetDataUsingDataContract(AES.Services.Data.CompositeType composite) 
    { 
     if (composite == null) 
     { 
      throw new ArgumentNullException("composite"); 
     } 
     if (composite.BoolValue) 
     { 
      composite.StringValue += "Suffix"; 
     } 
     return composite; 
    } 
} 

如何利用我的客戶端類型用於datacontract類型?客戶端爲服務生成代理,生成的類型是新類。我不應該使用DataContract名稱與服務器端DataContract匹配的客戶端類型嗎?

我期望能夠在客戶端執行此代碼,不是嗎?

 Service.Service1Client client = new Service.Service1Client(); 

     ClientType ct = new ClientType(); 
     client.GetDataUsingDataContract(ct); 

但上述代碼失敗,因爲我傳遞的參數不是通過服務引用生成生成的代理類。我想如何使用我的客戶端版本的數據合同?

UPDATE

我已經找到工作的解決方案是使用通道工廠,並創建自己的客戶端的ServiceContract和DataContract,起初我不喜歡它,但我意識到,這正是無論如何,ServiceReference正在做。我在客戶端和服務器上的ServiceContractAttribute和DataContractAttribute上放置了一個公用名稱和名稱空間。現在我可以獨立開發/進化我的課程。

此鏈路支持這種做法,以及:http://www.codeproject.com/Articles/55690/WCF-Loose-coupling-of-WCF-Service-and-Data-Contrac

回答

1

使用客戶端實體WCF的關鍵是: 一)將它們放在一個單獨的程序/項目(如果它們尚不存在)。 b)如果您已經添加了服務參考,請刪除服務參考。 c)從客戶項目添加項目引用到實體項目。 d)重新添加服務參考

VS使用SvcUtil添加服務引用,將使用被引用項目中的實體而不是生成它們。

有一個警告。如果客戶端和服務器中的實體處於不同程序集中,則添加服務引用可能不起作用。我必須進一步深入探討爲什麼有時會出現這種情況。但是,如果添加服務引用不起作用,那麼您只需使用ChannelFactory即可。

乾杯, 託尼

+1

我已經找到工作的解決方案是使用通道工廠,並創建自己的客戶端的ServiceContract和DataContract,起初我不喜歡它,但我意識到,這正是無論如何,ServiceReference正在做。我在客戶端和服務器上的ServiceContractAttribute和DataContractAttribute上放置了一個公用名稱和名稱空間。現在我可以獨立開發/進化我的課程。我認爲這是你建議的方法。 – 2014-09-19 12:51:00