C# WCF服务的VS2003 Web引用有额外的;IdSpecified";参数
我正在使用VSTS 2008+.Net 3.5+C#开发一个WCF服务,当我也使用VSTS 2008开发客户端(使用添加服务引用功能自动生成客户端web服务代理代码)时,它工作得很好。我开发的WCF使用basicHttpBinding 我遇到的问题是,当我使用Visual Studio.Net(Visual Studio 2003)生成客户端web服务代理代码时,有一个名为IdSpecified(bool type)的OperationContract方法的附加输入参数。我已经测试过,当将IdSpecified指定为true时,Id参数的值将正确传递给WCF服务器端,但当我将IdSpecified指定为false时,无论我为Id参数指定了什么值,在WCF服务器端,Id将始终为0。我还尝试了输入参数类型,比如字符串,在客户端并没有这样的额外输入参数 我的问题是为什么会有一个额外的参数?其含义是什么?是否有可能避免生成此类附加参数 下面是Visual Studio.Net自动生成的客户端web服务代理代码C# WCF服务的VS2003 Web引用有额外的;IdSpecified";参数,c#,.net,wcf,web-services,asmx,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 type)的OperationContract方法的附加输入参数。我已经测试过,当将IdS
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]));
}
您可以尝试使用DataContract而不是简单的整数参数。数据协定允许您指定是否需要某个成员,如果该成员是必需的,则可能会删除该奇怪的额外bool。您可以尝试使用数据协定而不是简单的整数参数。数据契约允许您指定是否需要某个成员,如果该成员是必需的,则可能会删除该奇怪的额外bool。George 这种行为是经过设计的,从.NET1.0开始就存在了。事实上,如果您使用VS2003创建一个具有相同方法签名的ASMXWeb服务,您会发现相同的结果 问题在于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中的代理是什么样子。George
这种行为是经过设计的,从.NET1.0开始就存在了。事实上,如果您使用VS2003创建一个具有相同方法签名的ASMXWeb服务,您会发现相同的结果
问题在于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中的代理是什么样子。谢谢blowdart,为什么Visual Studio.Net和VSTS 2008会生成不同的客户端代理代码?顺便说一句:1。如何使用DataContract指定需要的参数?我搜索了MSDN,但没有找到答案。2.必填表示客户端必须提供值?感谢blowdart,为什么Visual Studio.Net和VSTS 2008会生成不同的客户端代理代码?顺便说一句:1。如何使用DataContract指定需要的参数?我搜索了MSDN,但没有找到答案。2.必选意味着客户端必须提供一个值?谢谢John,您完全正确--我正在VS2003上使用.Net 1.0。我对您提到的解决方案感兴趣--“该解决方案是添加一个单独的布尔字段,您可以设置该字段以说明是否提供值。”,您能给我一些参考代码吗?我们是在客户端还是服务器端解决它?对不起,我不清楚。“解决方案”是微软实施的。你看到了解决办法。请注意,您有一个名为“IdSpecified”的额外参数。另外,VS2003是.NET1.1。谢谢John,1。我已经阅读了您的优秀代码示例,我应该将每个值类型包装到DataContract中,并使用required属性?2.我很好奇VS2003和VSTS 2008生成不同的客户端代码,它们中的任何一个都不符合Web服务(WSDL)标准?您可以进行包装。你不必这么做。WSDL标准也没有提到客户端代码。是的,必需的方法必须始终存在。在XML模式中,该模式为minOccurs=“1”。对不起,我用了“退货”这个词。我的意思是int永远不能为null。现在在C#2.0的.NET3.5中,我们可以说“int?id”,它可以是整数,也可以是空值。我们在.NET 1.0和1.1中无法做到这一点,因此Microsoft不得不使用额外的“IdSpecified”参数或属性来伪造它。谢谢John,你绝对正确--我在VS2003中使用的是.NET 1.0。我对您提到的解决方案感兴趣--“该解决方案是添加一个单独的布尔字段,您可以设置该字段以说明是否提供值。”,您能给我一些参考代码吗?我们是在客户端还是服务器端解决它?对不起,我不清楚。“解决方案”是微软实施的。你看到了解决办法。请注意,您有一个名为“IdSpecified”的额外参数。另外,VS2003是.NET1.1。谢谢John,1。我已经阅读了您的优秀代码示例,我应该将每个值类型包装到DataContract中,并使用required属性?2.我很好奇VS2003和VSTS 2008生成不同的客户端代码,它们中的任何一个都不符合Web服务(WSDL)标准?您可以进行包装。你不必这么做。WSDL标准也没有提到客户端代码