我有一个 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
你已经有FirstName
和 LastName
,你会没事的:旧的 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/