2009-06-15 47 views
4

我试图将ASP.Net Web服务转换为WCF应用程序。客户端位于不支持WCF的.Net Compact Framework上,因此我需要确保WCF始终支持ASP样式的Web服务。当我在Visual Studio中添加Web服务引用时,生成的代理类的方法有额外的参数。为什么我的wcf Web服务参考中有额外的参数?

例如,如果一个方法被定义为:

public void GetEmpInfo(int empNo) 

这种方法会出现在代理类为:

public void GetEmpInfo(int empNo, bool empNoSpecified) 

是什么原因导致这一点,我怎么得到它停止?

回答

8

看看这个blog post ...

没有这些额外的布尔 “规定”的成员来自何处?他们做什么 ?答案是WCF数据合同串行器 默认生成的模式 。由于 版本模式的工作原理, 串行器会生成所有数据成员 作为可选元素。旧Web服务栈ASP.NET Web Services (“ASMX”)使用不同的序列化程序XmlSerializer,该程序维护了 完整的模式和XML保真度。所述 XmlSerializer的所有可选 元素映射到两个成员:一个 表示数据本身,和一个 指定数据是否是 实际存在 - 这是 “xxxSpecified”构件。这些 xxx指定的成员必须设置为 true才能使对应的“实际数据” 成员序列化为 。

+0

仅供参考,使用SOAP 1.2的WSDL由Spring-WS在.net 3.5服务时,也参与这些额外的方法。 – 2009-07-22 03:53:52

1

.NET Compact Framework确实支持WCF的一个子集。您可以在MSDN上查看此支持。看一看,它可能足以支持您删除旧版Web服务支持。

0

这发生在默认值为非空的类型上。在这种情况下,这是不可能的网络服务来了解一个参数是否设置为默认值,或者根本就没有设置在所有。

您可以通过与[XmlSerializerFormat]属性像装饰你的操作摆脱多余的规格参数:

[OperationContract] 
    [XmlSerializerFormat] 
    string GetEmpInfo(int? empNo); 

这个属性也可以在类的级别增加,这将使得在大多数情况下的感觉。

我明白了,你可以处理使用可空类型(int?)这种情况,但我无法用这个来修复它。