为什么我的wcf Web服务引用中有额外的参数?
我正在尝试将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)
是什么导致这种情况,如何让它停止?
看看这篇博客文章 ……
这些额外的布尔“指定”成员来自哪里,他们做了什么? 答案是WCF数据协定序列化程序默认生成的模式。 由于其版本控制模型的工作方式,序列化程序会将所有数据成员生成为可选元素。 较旧的Web服务堆栈,ASP.NET Web服务(“ASMX”),使用不同的序列化程序XmlSerializer,它维护完整的架构和XML保真度。 XmlSerializer将所有可选元素映射到两个成员:一个表示数据本身,另一个指定数据是否实际存在 – 这是“xxxSpecified”成员。 必须将这些xxxSpecified成员设置为true才能启用相应“实际数据”成员的序列化。
.NET Compact Framework确实支持WCF的子集。 您可以在MSDN上查看此支持。 看一下,它可能足以支持您删除旧的Web服务支持。
对于默认值为not null的类型,会发生这种情况。 在这些情况下,Web服务无法知道参数是设置为默认值还是根本不设置。
您可以通过使用[XmlSerializerFormat]
属性修改操作来消除额外的规范参数,如:
[OperationContract] [XmlSerializerFormat] string GetEmpInfo(int? empNo);
此属性也可以在类级别添加,这在大多数情况下都有意义。
我知道你可以使用可空类型( int?
)来处理这种情况,但我无法使用它来修复它。
- 将文件从Flex上传到WCF REST Stream问题(如何在REST WS中解码多部分表单post)
- 如何在客户端启用WCF跟踪?
- WCF执行错误:此工厂启用了手动寻址,因此必须预先发送所有发送的消息
- Web服务不使用代理类处理来自同一应用程序的多个同时请求
- 在为WCF服务生成类型时,.NET加载了寻找另一个版本的程序集
- entity framework – 基础提供程序在ConnectionString上失败
- 使用DataContractSerializer序列化接口列表
- 为什么我的WSDL仍然显示基本的http绑定与http的位置值?
- OutOfMemoryException,堆栈大小很大,线程数量很大