[英]VS2003 Web Reference for a WCF Service has Extra “IdSpecified” Parameter
我正在使用VSTS 2008 + .Net 3.5 + C#开发WCF服务,并且当我也使用VSTS 2008开发客户端(使用添加服务引用功能自动生成客户端Web服务代理代码)时,它可以正常工作。 我开发的WCF使用basicHttpBinding。
我遇到的问题是,当我使用Visual Studio.Net(Visual Studio 2003)生成客户端Web服务代理代码时,OperationContract方法的另一个输入参数称为IdSpecified(布尔类型)。 我已经测试过,当将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:这是客户端自动生成的有关轮询方法的代码的一部分。
[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没有可为null的类型)。 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而不是简单的整数参数。 数据合同允许您指定是否需要某个成员,如果需要该成员,则可以删除该怪异的多余布尔值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.