Skip to main content
 首页 » 编程设计

c#之WCF 服务的 VS2003 Web 引用有额外的 "IdSpecified"参数

2024年02月03日25duanxz

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

我遇到的问题是,当我使用 Visual Studio.Net (Visual Studio 2003) 生成客户端 Web 服务代理代码时,OperationContract 方法有一个额外的输入参数,称为 IdSpecified( bool 类型)。我已经测试过,当指定 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 实现的解决方案是添加一个单独的 bool 字段或属性,您可以设置它来说明您是否提供该值。

这意味着当你的 .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 中的样子。