为什么要封装ASMX代理方法的参数?

时间:2019-01-24 14:14:53

标签: c# asp.net soap wsdl

我正在VS2015或VS2017项目(网络4.6.1)中向第三方ASMX Web服务添加服务引用。

我使用Visual Studio中的常规用户界面(右键单击->添加新服务参考)来执行此操作。我使用默认设置,除了对生成的类我不满意外,其他一切似乎都可以正常工作。

根据WSDL,我希望使用以下方法:

ServiceSoapClient ssc = new ServiceSoapClient(); 
object response = ssc.getEmployees("xxx", "yyy", "zzz");

但是我得到的是我必须像这样使用的类:

ServiceSoapClient ssc = new ServiceSoapClient(); 
getEmployeesResponse response = ssc.getEmployees(
        new getEmployeesRequest
        {
            Body = new getEmployeesRequestBody { Division = "xxx", Username = "yyy", Password = "zzz" }
        });

每个方法都需要一个Request-Parameter,它本身具有一个Body-Element。主体元素具有所有必需的参数。

方法的定义类似于在浏览器中打开的方法:

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <getEmployees xmlns="xxx">
      <division>string</division>
      <Username>string</Username>
      <Password>string</Password>
    </getEmployees>
  </soap:Body>
</soap:Envelope>

这是WSDL中此方法的信息:

<s:element name="getEmployees">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="division" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="Username" type="s:string"/>
<s:element minOccurs="0" maxOccurs="1" name="Password" type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>
<s:element name="getEmployeesResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="getEmployeesResult" type="tns:XMLResponse"/>
</s:sequence>
</s:complexType>
</s:element>

<wsdl:operation name="getEmployees">
<wsdl:input message="tns:getEmployeesSoapIn"/>
<wsdl:output message="tns:getEmployeesSoapOut"/>
</wsdl:operation>

<wsdl:operation name="getEmployees">
<soap:operation soapAction="http://xxx/getEmployees" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>

为什么我无法使用带有字符串类型的三个参数的方法?我甚至可以在客户端控制此操作吗?还是有一个常见错误?

当我自己提供Web服务或使用其他服务时,我从来没有遇到过这个问题。

1 个答案:

答案 0 :(得分:0)

我找到了原因。在“服务参考”的设置中,您必须激活“生成异步操作”。

enter image description here