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

时间:2009-07-26 10:38:13

标签: c# .net wcf web-services asmx

我正在使用VSTS 2008 + .Net 3.5 + C#开发WCF服务,当我还使用VSTS 2008开发客户端(使用添加服务引用功能自动生成客户端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]));
}

2 个答案:

答案 0 :(得分:4)

乔治,

此行为是设计使然,自.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中的样子。

答案 1 :(得分:1)

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