【问题标题】:How to use XmlAttributeOverrides with WCF如何在 WCF 中使用 XmlAttributeOverrides
【发布时间】:2011-08-07 18:35:56
【问题描述】:

我有一个使用 basicHttpBinding 的 WCF 服务。在服务方法上,我有一个返回的类,对于这个类,我需要动态/以编程方式排除属性并更改 XML 的属性名称。这需要在 WSDL 中以及在调用服务方法时完成。

我已经搜索了最佳解决方案,看来我需要 (1) 将 XmlAttributeOverrides 与 XmlSerializer 一起使用,或者 (2) 在需要自定义的类上实现 IXmlSerializable。或者可能有更好的解决方案。我知道可以将属性名称+“指定”添加到类中,然后可以排除这些属性。但是,这并不排除在 WSDL 中,也不能解决属性重命名问题。

我为什么要这个?因为我们的应用程序的全球化和定制化。我们的应用程序中内置了许多属性,这些属性可能会被重命名或对应用程序的用户完全隐藏。

经过大量研究,我最好的选择是用我自己的自定义序列化程序替换 WCF 序列化程序。但是,我从来没有找到如何为使用 XmlSerializer 的自定义类执行此操作的好示例。此外,我不确定如何为特定类传递 XmlAttributeOverrides。

另外,对于其他想要相同功能的人来说可能不是这种情况,但在我的应用程序中,我只需要在应用程序的生命周期内初始化一次值。太糟糕了 C# 不允许静态只读变量与属性一起使用。

这是一个简单的类示例:

public Customer
{
  public string Address1
  {
    get;
    set;
  }

  public string Address2
  {
    get;
    set;
  }

  public string Zipcode
  {
    get;
    set;
  }
}

在本例中,我想为应用程序的某些安装使用 PostalCode 而不是 Zipcode 并隐藏 Address2 属性。

非常感谢您的帮助。

谢谢, 泰勒

【问题讨论】:

    标签: c# xml wcf xmlserializer


    【解决方案1】:

    我们的应用程序中内置了许多属性,这些属性可能会被重命名或对应用程序的用户完全隐藏。

    一种标准方法是创建一个特殊的数据传输对象 (DTO)。或者几个。

    【讨论】:

    • 不是任何具有属性的类都是 DTO 吗?我认为在从 DTO 构建 xml 和 xml 架构时,我已经遇到了 DTO 问题,我需要动态排除和重命名属性。您能否链接一篇关于在 WCF 中使用 DTO 实现此目的的“标准方法”的文章?
    • 而 DTO 并没有什么特别之处(相反)。重点是它们是为转移工作而设计的。
    • Web 服务根据应用程序的安装而呈现不同的想法并不少见。查看 salesforce.com,由于应用程序的可扩展性,一家公司的 wsdl 看起来与另一家公司非常不同。这类似,Web 服务根据应用程序配置而有所不同,这通常是在安装时完成的。
    【解决方案2】:

    我知道这看起来有点像警察,但既然你的对象属性名称是动态的,为什么不直接使用属性装袋而不是做这个 XMLSerializer shuffle?

    【讨论】:

    • OP 提到了 WSDL 等 - 此外,属性包几乎 没有 提供序列化布局的选择。
    • 属性包会将我的属性名称更改为索引器字符串,让我可以灵活地实时选择名称。但是,我认为 wsdl 和客户端消费对象不会真正获得属性索引器或数据类型的良好定义。我真的需要更好的结构化 XML 和模式。我将在我的 OP 中添加一个示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多