Почему параметры ASMX Proxy Methods инкапсулированы? - PullRequest
0 голосов
/ 24 января 2019

Я добавляю ссылку на сервис к стороннему веб-сервису ASMX в моем проекте VS2015 или VS2017 (Net 4.6.1).

Я делаю это с помощью обычного интерфейса пользователя в 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" }
        });

Каждый метод нуждается в одном параметре запроса, который сам имеет элемент Body.Элемент Body имеет все необходимые параметры.

Метод при открытии в браузере определяется следующим образом:

<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>

Почему я не получаю метод с тремя параметрами типа string?Могу ли я даже контролировать это на стороне клиента или есть распространенная ошибка?

Когда я предоставляю веб-сервисы самостоятельно или использую другие сервисы, у меня никогда не было этой проблемы раньше.

1 Ответ

0 голосов
/ 19 февраля 2019

Я нашел причину.В настройках «Справочника услуг» необходимо активировать «Генерация асинхронных операций».

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...