繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM