Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF服务的VS2003 Web引用有额外的;IdSpecified";参数_C#_.net_Wcf_Web Services_Asmx - Fatal编程技术网

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

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

我正在使用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服务代理代码

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标准也没有提到客户端代码