我正在从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
}
答案 0 :(得分:3)
我最近为自己找到了这个。在某些情况下,它在XSD中与minoccurs=0
进行了todo。 WCF代理类不使用可空类型,因此XmlSerializer无法确定您是否想要发送某个字段。
您可以设置one
,但不会发送。您还必须将oneSpecified
设置为true
,以使序列化程序序列化one
的值并发送。
更多信息here。