[英]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.