使 WCF 反序列化程序具有容错能力

本文关键字:容错 能力 程序 WCF 反序列化 | 更新日期: 2023-09-27 18:32:24

>假设我有一个 C# Web 应用程序和一个 C# WCF 服务漂浮在某个地方。他们按照这样的合同运作:

[ServiceContract]
public interface IRemoteDeliveryService
{
    [OperationContract]
    Customer GetCustomer();
}

。客户是:

[Serializable]
public class Customer
{
    public string Name { get; set; }
    public int Age { get; set; }
}

现在假设 Web 应用程序已更新为与 WCF 服务无关但会导致扩展客户的功能。

[Serializable]
public class Customer
{
    public string Name { get; set; }
    public int Age { get; set; }
    public int Income { get; set; } // new!
}

根据经验,如果服务引用和服务未立即更新,则用户将开始收到此错误,直到推送 WCF 服务以反映新对象:第 1 行位置 21175 中的错误。不需要来自命名空间"http://schemas.datacontract.org/2004/07/(任何 2)"的"EndElement"(无论什么)"。期待元素"_whatever3"。

我已经尽我所能避免这种情况。我删除了许多对复杂对象的依赖关系,但有些(如客户)非常重要,很难完全从 WCF 通信中删除。我尝试阻止属性被序列化,但 WCF 还是这样做了。

如何使 WCF 服务对 Web 应用引入的潜在额外属性更具容忍度?我可以修改服务和 Web 应用程序,只要修改服务可以最大程度地减少将来的过度重新部署即可。

使 WCF 反序列化程序具有容错能力

使用数据传输对象 (DTO)。 这些类应属于服务,并且仅在更新服务时应更改。 使用自动映射器之类的功能将业务对象、实体、模型等映射到您的 DTO 中。

分离层(并确保这些层不会相互渗透)将允许您进行类似您描述的更改,而不会影响其他层。