我正在使用 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 中的样子。
