我已经导入了一个WSDL文件(使用SoapUI检查得很好)并且大部分功能都按预期工作。
我遇到的问题是有一些操作将SAME输入类型作为输出类型。
实施例
<operation name="FindID">
<documentation>Get ID For search</documentation>
<input message="tns:StringIO"/>
<output message="tns:StringIO"/>
</operation>
其中StringIO消息由
定义<message name="StringIO">
<part name="StringIO" type="xs:string" />
</message>
在SOAP UI中,FindID函数按预期工作,在使用此函数的PHP页面上,它按预期工作。
当我尝试调用该函数时,在Visual Studio中,它应该被称为
string MyResults = WebInterface.FindID(SearchString);
因为FindID应该返回一个字符串,而Visual Studio似乎想要将其导入为
void FindID(ref string SearchString)
不是
string FindID(string SearchString)
现在我找到了一个解决方案(有效,但我不相信这是“正确”的方法) 如果我创建新消息
<message name="SecondOutput">
<part name="SecondOutput" type="xs:string" />
</message>
并将WSDL函数修改为
<operation name="FindID">
<documentation>Get ID For search</documentation>
<input message="tns:StringIO"/>
<output message="tns:SecondOutput"/>
</operation>
然后是Visual Studio&amp; SoapUI和PHP页面都很开心,表现正常。
那为什么我不能输入我的输入消息&amp;输出消息的类型相同???
答案 0 :(得分:2)
这是预期的行为。
当你说你希望它被称为:
string MyResults = WebInterface.FindID(SearchString);
这似乎只是您的假设。
WSDL中没有任何内容可以明确地允许您得出结论。出于互操作目的,以下两种方法在语义上是相同的:
void FindID(ref string);
string FindID(string);
.Net框架使用WSDL规范来推断方法签名。它在上述两个等价物之间选择的方式是检查所使用的消息。因为,为输入和输出参数指定了相同的消息,.Net正在推断(相当逻辑上恕我直言)第一个签名更正确地反映了服务提供商的意图。