簡體   English   中英

WCF DataContract等價混淆

[英]WCF DataContract Equivalence confusion

我有這樣的服務器端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名稱的客戶端類型?

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

        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

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

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

有一個警告。 如果客戶端和服務器中的實體位於不同的程序集中,則無法添加服務引用。 我必須進一步研究為什么有時會出現這種情況。 但是,如果添加服務引用不起作用,那么您要做的就是使用ChannelFactory。

干杯,托尼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM