2010-01-14 98 views
1

我看到的代理方法为类似List Of <T>等参数的泛型生成的方法正在被转换为代理方法中的数组。我不确定是什么问题,它是随Visual Studio 2005附带的wsdl.exe无法处理泛型,还是Web服务部署或其他机器上的soap版本?当我在IE 7中查看asmx文件时,我看到了SOAP 1.1,我期望看到soap 1.2,但这可能是IE7的事情。Visual Studio 2005 wsdl.exe可以使用泛型参数创建代理方法吗?

+0

这个帮助吗? svcutil.exe http://localhost/Services/Sample.svc?wsdl /ct:System.Collections.Generic.List'1 – 2010-01-14 19:59:15

+0

@Rubens:他使用VS2005。 – 2010-01-14 20:09:34

回答

1

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

当你升级到WCF时,你将能够指定使用List<T>这样的列表。


XML Schema既没有数组也没有列表,只是重复的元素。举例来说,如果你的服务返回List<int>,WSDL中的XML模式会像

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

创建代理类必须决定是否翻译成数组或列出了此程序。使用“添加Web引用”,选择始终是“数组”。使用“添加服务参考”,您可以得到多种选择,包括List<int>

+0

我认为这只是使用DataContractSerializer而不是'传统'XmlSerializer? – STW 2010-01-14 19:34:28

+0

当然。 “遗产”意味着死亡。 – 2010-01-14 19:36:31

+0

@John在“现实世界”中的一部分我在“遗产”中描述了我们大多数开发人员日复一日地写的东西 - 并且将捍卫他们的牙齿和指甲的做法。再次,我们的开发人员只是使用* .NET ...他们不是真正的.NET开发人员。 :-( – STW 2010-01-14 20:00:52

1

.NET的XmlSerializer将集合序列化为数组。我不熟悉泛型列表是否有任何区别,但我很怀疑。因为这样的SOAP“集合”总是.NET数组,所以生成的代理将数组恢复到适当的集合类型(这真的是它的选择)。

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

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

此行为主义是特定于XmlSerializer的,二进制序列化(或许WCF的DataContractSerializer的)可以处理这些条件。

+0

因此,如果方法包含通用列表,SOAP将它转换为你的代理方法中的一个数组,因为如果我使用该方法,我无法使用代理类进行编译,你说它取决于生成的代理来将数组恢复到正确的类型。手动修改生成的代理类来传递正确的类型?我想我没有一个例子仍然困惑。 – OutOFTouch 2010-01-14 19:38:29

+0

XML Schema既没有数组也没有列表,只是重复的元素。代理必须决定是否将其转换为数组或列表。使用“添加Web引用”,选择始终是“数组”。通过“添加服务参考”,您可以获得多种选择。 – 2010-01-14 19:39:57

+0

该项目是在VS 2005中构建的,我没有“添加服务引用”选项,但我很欣赏解释, 所以,我必须手动更改自动生成的代理方法以使用通用列表数组的? – OutOFTouch 2010-01-14 19:45:17

0

泛型不可互操作。

+0

很多人会建议2005/ASMX webservices不能互操作;-) – STW 2010-01-14 19:35:05

+0

当然不是,但我不认为它们被设计成是或者被设计成他们? WCF旨在尽可能地实现互操作。 – 2010-01-14 19:37:11

+0

@Yooder:很多人会错的。他们已经死了,但是完全可以互操作。 – 2010-01-14 19:37:11

相关问题