用于WCF服务的VS2003 Web参考具有额外的“IdSpecified”参数

我正在使用VSTS 2008 + .Net 3.5 + C#开发WCF服务,当我还使用VSTS 2008开发客户端(使用添加服务引用function自动生成客户端Web服务代理代码)时,它工作正常。 我开发的WCF使用basicHttpBinding。

我遇到的问题是,当我使用Visual Studio.Net(Visual Studio 2003)生成客户端Web服务代理代码时,还有一个名为IdSpecified(bool类型)的OperationContract方法的附加输入参数。 我已经测试过,当IdSpecified指定为true时,Id参数的值将正确传递给WCF服务器端,但是当我指定IdSpecified为false时,无论我指定给Id参数的值是什么,在WCF服务器端,Id都将是总是0.我也尝试输入参数类型,如字符串,客户端没有这样的附加输入参数。

我的问题是为什么还有一个额外的参数? 它的含义是什么,是否可以避免生成这样的附加参数?

这是Visual Studio.Net自动生成的客户端Web服务代理代码,

public StudentInfo Poll(int Id, [System.Xml.Serialization.XmlIgnoreAttribute()] bool IdSpecified) 

这是我的VSTS 2008 WCF服务器端代码,

 [OperationContract] StudentInfo Poll(int Id); 

编辑1:这是客户端自动生成的关于Poll方法的代码的一部分。

 [return: System.Xml.Serialization.XmlElementAttribute(IsNullable=true)] public StudentInfo Poll(int Id, [System.Xml.Serialization.XmlIgnoreAttribute()] bool IdSpecified) { object[] results = this.Invoke("Poll", new object[] { Id, IdSpecified}); return ((StudentInfo)(results[0])); } 

乔治,

此行为是设计使然,自.NET 1.0以来一直存在。 实际上,如果您使用VS2003创建ASMX Web服务,并使用相同的方法签名,您将找到相同的结果。

问题在于WSDL中标记为不需要的值类型。 由于它们是值类型,因此它们不能返回null(并且VS2003没有可空类型)。 Microsoft实现的解决方案是添加一个单独的布尔字段或属性,您可以设置它来表示您是否提供该值。

这意味着当您的.NET 1.1应用程序想要调用该服务时,它需要设置IdSpecified参数:

 using (WebReference1.PollService svc = new WebReference1.PollService()) { StudentInfo info = svc.Poll(id, true); // True to specify } 

我没试过,但你为什么不这样做:

 [DataContract] public class PollParameters { [DataMember(Required = true)] public int Id; } [OperationContract] public StudentInfo Poll(PollParameters parameters); 

试试看VS2003中代理的样子。

您可以尝试使用DataContract而不是简单的整数参数。 数据合同允许您指定是否需要成员,如果成员是必需的,则可以删除那个奇怪的额外布尔值。