【问题标题】:Can Visual Studio 2005 wsdl.exe create proxy methods with generic parameters?Visual Studio 2005 wsdl.exe 可以使用泛型参数创建代理方法吗?
【发布时间】:2010-01-15 03:42:31
【问题描述】:

我所看到的为具有诸如List Of <T> 之类的参数泛型的方法生成的代理方法正在被转换为代理方法中的数组。我不确定问题出在哪里,是 Visual Studio 2005 附带的 wsdl.exe 无法处理泛型,还是部署 Web 服务的机器上的 soap 版本或其他什么?当我在 IE 7 中查看 asmx 文件时,我看到了 SOAP 1.1,我希望看到的是 soap 1.2,但这可能是 IE7 的问题。

【问题讨论】:

标签: visual-studio wsdl.exe


【解决方案1】:

WSDL.EXE 和“添加 Web 引用”将始终使用数组。这与泛型无关。

当您升级到 WCF 时,您将能够指定将 List<T> 用于此类列表。


XML Schema 既没有数组也没有列表,只有重复的元素。例如,如果您的服务返回 List<int>,则 WSDL 中的 XML Schema 将类似于

<xs:element name="result" maxOccurs="unbounded" type="xs:int"/>

创建代理类的程序必须决定是将其转换为数组还是列表。使用“添加 Web 引用”,选择始终是“数组”。使用“添加服务参考”,您有多种选择,包括List&lt;int&gt;

【讨论】:

  • 我认为这只是使用 DataContractSerializer 而不是“旧版”XmlSerializer?
  • @John 在我在“遗产”中的“现实世界”部分描述了我们大多数开发人员日复一日地写的东西——并将捍卫他们的实践。话又说回来,我们的开发人员只是使用 .NET...他们并不是真正的.NET 开发人员。 :-(
  • @Yooder:很高兴你可以活在过去,而我们其他人都在进步,但请注意,“遗产”也有一些实际意义。示例:“旧版”ASMX Web 服务处于维护模式。这大大减少了微软将要修复的错误数量,几乎为零。同样,“添加 Web 引用”将永远不支持在代理中使用 List&lt;T&gt;
【解决方案2】:

.NET 的 XmlSerializer 将集合序列化为数组。我不熟悉通用列表是否有任何区别,但我对此表示怀疑。由于此类 SOAP“集合”始终是 .NET 数组,因此由生成的代理将数组恢复为正确的集合类型(这确实是它的选择)。

将集合序列化为数组的另一个副作用是只有集合元素被序列化。例如,下面的类继承自一个列表并添加了一个新属性,该属性不会由 XmlSerializer 序列化,因为数组仅包含元素而不包含其他属性。

public class MyList : List
{
    public string MyProperty{get;set;}
}

这种行为主义特定于 XmlSerializer,二进制序列化器(也许还有 WCF 的 DataContractSerializer)可以处理这些情况。

【讨论】:

  • 因此,如果该方法包含通用列表,SOAP 会将其转换为代理方法中的数组,因为如果我使用该方法,我无法使用代理类进行编译,你说由生成的代理决定将数组恢复为正确的类型。您是说手动修改生成的代理类以传递正确的类型吗?没有例子,我想我仍然感到困惑。
  • XML Schema 既没有数组也没有列表,只有重复的元素。代理必须决定是否将其转换为数组或列表。使用“添加 Web 引用”,选择始终是“数组”。使用“添加服务参考”,您可以获得多种选择。
  • 这个项目是在VS 2005中构建的,我没有“添加服务引用”选项可用,但我很欣赏解释,所以我必须手动更改自动生成的代理方法使用通用列表而不是数组?
  • @OutOfTouch:我认为您需要手动处理转换——是否通过向生成的代理添加部分类(部分类在“更新网络参考”操作)或通过将代理生成的类映射到您完全控制下的非生成 POCO。
  • 没有。永远不要编辑生成的代码 - 您的编辑将在您下次使用“更新 Web 参考”时消失。您可以使用部分类将您自己的方法添加到代理类。这些方法可以调用代理方法,但将数组加载到相应的列表类型中。
【解决方案3】:

泛型不可互操作。

【讨论】:

  • 许多人会建议 2005/ASMX 网络服务不可互操作 ;-)
  • 当然不是,但我不认为它们是被设计成的,或者是吗? WCF 旨在尽可能地实现互操作。
  • @Yooder:很多人都会错的。它们已经死了,但可以互操作。
  • @Terry:代码返回List&lt;int&gt; 的事实并未进入 WSDL。它显示为&lt;xs:element type="xs:int" maxOccurs="unbounded"/&gt;
猜你喜欢
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 1970-01-01
  • 2011-01-07
  • 1970-01-01
相关资源
最近更新 更多