具有相同输入和输出消息的SOAP操作产生奇数代理方法签名

时间:2012-03-09 21:10:55

标签: wcf visual-studio wsdl soapui

我已经导入了一个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;输出消息的类型相同???

1 个答案:

答案 0 :(得分:2)

这是预期的行为。

当你说你希望它被称为:

string MyResults = WebInterface.FindID(SearchString);

这似乎只是您的假设。

WSDL中没有任何内容可以明确地允许您得出结论。出于互操作目的,以下两种方法在语义上是相同的:

void FindID(ref string);
string FindID(string);

.Net框架使用WSDL规范来推断方法签名。它在上述两个等价物之间选择的方式是检查所使用的消息。因为,为输入和输出参数指定了相同的消息,.Net正在推断(相当逻辑上恕我直言)第一个签名更正确地反映了服务提供商的意图。