添加到webmethods的额外参数

时间:2011-11-15 11:23:41

标签: c# wcf reflection proxy

我正在从wsdl生成的代理中读取一些MethodInfo

其中一种方法有三个(int)参数和一个int返回类型,但当我探索ParameterInfo[]时,我实际上看到了八个参数:

  • Int32
  • Boolean
  • Int32
  • Boolean
  • Int32
  • Boolean
  • Int32&
  • Boolean&

这些额外参数来自哪里?

更新

再详细说明一下,生成的代理中的代码如下所示:

  /// <remarks/>
[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://tempuri.org/IInleerAppService/AddThreeNumbers", RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]
public void AddThreeNumbers(int one, [System.Xml.Serialization.XmlIgnoreAttribute()] bool oneSpecified, int two, [System.Xml.Serialization.XmlIgnoreAttribute()] bool twoSpecified, int three, [System.Xml.Serialization.XmlIgnoreAttribute()] bool threeSpecified, out int AddThreeNumbersResult, [System.Xml.Serialization.XmlIgnoreAttribute()] out bool AddThreeNumbersResultSpecified) {
    object[] results = this.Invoke("AddThreeNumbers", new object[] {
                one,
                oneSpecified,
                two,
                twoSpecified,
                three,
                threeSpecified});
    AddThreeNumbersResult = ((int)(results[0]));
    AddThreeNumbersResultSpecified = ((bool)(results[1]));
}

这是为什么?

更新

如果你被这样做了,就像我一样,你可以通过简单地应用以下代码片段轻松避免显示这些额外的参数:

if (!parameterInfo[i].Name.EndsWith("Specified") && !parameterInfo[i].IsRetval && !parameterInfo[i].Name.EndsWith("Result"))
{
    // magic
}

1 个答案:

答案 0 :(得分:3)

我最近为自己找到了这个。在某些情况下,它在XSD中与minoccurs=0进行了todo。 WCF代理类不使用可空类型,因此XmlSerializer无法确定您是否想要发送某个字段。

您可以设置one,但不会发送。您还必须将oneSpecified设置为true,以使序列化程序序列化one的值并发送。

更多信息here