我有一个像这样的服务器端 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);
但是上面的代码失败了,因为我传递的参数不是通过服务引用生成生成的代理类 . 我怎么想使用我的客户端版本的数据 Contract ????
UPDATE
我发现工作的解决方案是使用通道工厂,并创建我自己的客户端ServiceContract和DataContract,起初我不喜欢它,但我意识到这正是ServiceReference正在做的事情 . 我在客户端和服务器上的ServiceContractAttribute和DataContractAttribute上放了一个公用名和命名空间 . 现在我可以独立开发/演化我的课程 .
此链接也支持此方法:http://www.codeproject.com/Articles/55690/WCF-Loose-coupling-of-WCF-Service-and-Data-Contrac
1 回答
将客户端实体与WCF一起使用的关键是:a)将它们放在单独的程序集/项目中(如果它们尚未存在) . b)如果已添加服务引用,请将其删除 . c)将客户项目中的项目引用添加到实体项目中 . d)重新添加服务引用
VS用于添加服务引用的SvcUtil将使用引用项目中的实体而不是生成它们 .
有一点需要注意 . 如果客户端和服务器中的实体位于不同的程序集中,则添加服务引用可能不起作用 . 我必须进一步深入研究为什么有时会出现这种情况 . 但是,如果添加服务引用不起作用,那么您所要做的就是使用ChannelFactory .
干杯,托尼