wcf - 向 WCF 数据契约(Contract)添加字段会破坏客户端?

标签 wcf

我有一个 WCF 服务,它返回一个实现 IExtensibleDataObject 的类。我需要向这个类添加一个新字段。我更新了 DataContract 接口(interface)并对类进行了更改。现在,当我尝试运行客户端应用程序时,出现以下错误:

Could not load file or assembly 'xxx.yyyy.zzzz, Version=1.3.9.26111, Culture=neutral, PublicKeyToken=b09e2f3e9b5894f0' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)



WFC 类的 AssemblyVersion 已更改 - 这会破坏客户端吗?

编辑:

生产中有使用此服务的客户端。如果可能的话,我不想让他们更新他们的服务引用并重新部署他们的客户来进行这个简单的更改。

最佳答案

这取决于您如何设置数据契约(Contract)。

在 WCF 中,使用所有默认值,您的服务将使用 DataContractSerializer (DCS) 将您的对象序列化为 XML。 DCS 将按顺序序列化您的字段 - 首先是公共(public)字段,然后是私有(private)字段。在每个可见性组中,它将按名称的字母顺序对字段/属性进行排序。

因此,如果您引入一个新的公共(public)属性 MiddleName你已经有FirstNameLastName ,你会没事的:旧的 XML 本来是

<YourObject>
   ....
   <FirstName>.....</FirstName>
   <LastName>.....</LastName>
</YourObject>

而您的新属性只需在最后添加一个新属性:
<YourObject>
   ....
   <FirstName>.....</FirstName>
   <LastName>.....</LastName>
   <MiddleName>....</MiddleName>
</YourObject>

这样的更新“在最后添加一些东西”应该可以正常工作,DCS 将只是简单地忽略 XML 中的附加标签。

但是:您是否引入了一个名为 Gender 的属性? ,那会卡住 之间<FirstName><LastName>因此会破坏 XML 中数据的顺序,从而破坏数据契约(Contract) - 没有“旧”客户端能够调用您的新服务。

为了控制这个,你可以把具体的Order=数据契约(Contract)中数据成员的属性:
[DataContract]
public class SomeAddress
{
   [DataMember(Order=0)]
   public string FirstName;

   [DataMember(Order=1)]
   public string LastName;
}

然后您可以轻松添加新属性 - 只需将其添加到列表末尾!
[DataContract]
public class SomeAddress
{
   [DataMember(Order=0)]
   public string FirstName;

   [DataMember(Order=1)]
   public string LastName;

   [DataMember(Order=2)]
   public string Gender;
}

所以通过使用 Order=属性,您可以控制您的 XML 布局,并且您可以对现有数据合约进行简单的扩展而不破坏更新。

有关更多背景和深入的专业知识,您应该阅读 Serialization in Windows Communication Foundation在 MSDN 杂志的网站上 - 强烈推荐。

关于wcf - 向 WCF 数据契约(Contract)添加字段会破坏客户端?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4272478/

相关文章:

wcf - 从 Web.config 启用 net.tcp 协议(protocol)

c# - 将参数添加到 WCF .svc 文件

java - WCF 身份验证服务

.net - WCF和可选参数

wcf - 使用 DataContractSerializer 序列化子类实例的实用方法是什么?

wcf - 如何生成wcf服务库项目的wsdl文件?

c# - 如何使用 WebHttpBinding 在 WCF 的 uri 路径中使用强类型参数

WCF - 创建可靠的 WCF 应用程序的技巧

c# - 从事务中排除操作

c# - 托管 WCF 的 Windows 服务 - 我可以从 WCF 服务中停止 Windows 服务吗?