我正在尝试将ASP.Net Web服务转换为WCF应用程序。客户端在.Net Compact Framework上,它不支持WCF,所以我需要确保WCF继续支持ASP样式的web服务。当我在Visual Studio中添加Web服务引用时,生成的代理类'方法有额外的参数。
例如,如果方法定义为:
public void GetEmpInfo(int empNo)
该方法将在代理类中显示为:
public void GetEmpInfo(int empNo, bool empNoSpecified)
导致这种情况的原因是什么?如何让它停止?
答案 0 :(得分:8)
查看此blog post ...
这些额外的布尔值在哪里 “指定的”成员来自和什么 他们做了吗?答案是架构 那个WCF数据契约序列化器 默认情况下生成。因为 它的版本模型工作的方式, serializer生成所有数据成员 作为可选元素。旧的网络 服务堆栈,ASP.NET Web服务 (“ASMX”),使用不同的序列化器, 维护的XmlSerializer 完整的架构和XML保真度。该 XmlSerializer映射所有可选项 元素分为两个成员:一个 代表数据本身,一个 指定数据是否为 实际存在 - 这是 “xxxSpecified”成员。这些 xxx指定的成员必须设置为 如果为true,则启用序列化 相应的“实际数据” 成员。
答案 1 :(得分:1)
.NET Compact Framework确实支持WCF的子集。您可以在MSDN上查看此支持。看一下,它可能足以支持您删除旧的Web服务支持。
答案 2 :(得分:0)
对于默认值为not null的类型,会发生这种情况。在这些情况下,Web服务无法知道参数是设置为默认值还是根本不设置。
您可以通过使用[XmlSerializerFormat]
属性修改操作来消除额外的规范参数,如:
[OperationContract]
[XmlSerializerFormat]
string GetEmpInfo(int? empNo);
此属性也可以在类级别添加,这在大多数情况下都有意义。
我知道你可以使用可空类型(int?
)来处理这种情况,但是我无法使用它修复它。