我正在使用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]));
}
答案 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而不是简单的整数参数。数据合同允许您指定是否需要成员,如果成员是必需的,可以删除那个奇怪的额外布尔。