【问题标题】:Consuming custom objects between webservices在 Web 服务之间使用自定义对象
【发布时间】:2009-09-17 18:07:38
【问题描述】:

我有一个 Web 服务,旨在通过自定义对象接受性能数据。自定义对象包含性能度量的集合(通用列表)以及其他数据。性能度量由简单的数据类型(字符串、整数和日期时间)组成。 webservice暴露的唯一方法需要传入这个自定义对象(性能数据对象)。

问题在于在外部使用这个自定义对象。我希望在另一个 web 服务中使用 Generic List 类的 Add() 和 Item() 方法以及该类中的各种其他功能。如果我从 Performance Data Webservice 请求对象,它会将内部集合序列化为 arrayList。我希望它仍然是一个通用集合。

我曾尝试过使用 XmlInclude 方法,但目前还没有找到解决方案。

我尝试做的下一件事是创建这个特定对象的程序集,该对象既可以用于性能数据 Web 服务,也可以用于任何卫星程序(即另一个 Web 服务)。这里的问题是,当我尝试传入由单独的程序集创建的自定义对象时,性能数据 web 服务将其称为不同的类型。 (另外我将 XmlInclude(GetType(custom assembly)) 属性应用于公开的方法)。但是仍然认为类型不可转换。

注意:我宁愿调用 Performance Data WS 来获取自定义对象,而不必处理向每个需要访问的项目添加程序集。

除了重构程序以使用 ArrayList 公开的方法之外,还有其他想法吗?

【问题讨论】:

  • Web 服务并不是用来传递自定义对象的,实际上它们会被序列化为 XML 标准类型。
  • 我已经在下面发布了解决方案。

标签: web-services


【解决方案1】:

如果您使用 WCF,您可以配置输出的集合类型,是 ArrayList、固定数组还是泛型 List。

【讨论】:

  • 不幸的是,我正在使用 .Net 2.0。
  • 你应该停止这样做。没有充分的理由。至少更新到 .NET 2.0 SP2。
  • 我使用的是 2.0 SP2。 WCF 是 3.x 基础。
【解决方案2】:

我找到了适用于 .Net 2.0 的解决方案。通过首先使用 Web 服务合同 (WSCF http://www.thinktecture.com/resourcearchive/tools-and-software/wscf/wscf-walkthrough) 我能够在两个服务之间传递通用集合。顾名思义,WSCF 的一个缺点是该方法需要使用契约优先而不是更常见的代码优先方法。幸运的是,在创建类和代理后修改它们并不是非常复杂。希望这可以帮助任何迷路的旅行者......

【讨论】:

  • 修改生成的代码不是最佳做法,因为一旦再次生成代码,您的修改就会丢失。
  • 我同意这不是最佳做法。第一次生成代码后,我不再使用自动生成。我只是像修改任何其他类一样修改代理类。除了将 xml 标记应用于方法之外,编码是相同的。如果你有,请提供一个更好的主意。
猜你喜欢
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
  • 2010-12-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多