Операция SOAP с одинаковыми входными и выходными сообщениями генерирует нечетную прокси-подпись

Я импортировал файл WSDL (отлично разбирается с SoapUI), и большинство функций работают так, как ожидалось.

Проблема, с которой я столкнулась, - это несколько операций, в которых тип ввода SAME является типом вывода.

пример

<operation name="FindID"> <documentation>Get ID For search</documentation> </operation>

Где сообщение StringIO определяется

<message name="StringIO"> </message>

В интерфейсе SOAP функции FindID работают так, как ожидалось, на страницах PHP, которые используют эту функцию, работают так, как ожидалось.

в Visual Studio, когда я пытаюсь вызвать функцию, ее следует вызвать как

string MyResults = WebInterface.FindID(SearchString);

поскольку FindID должен возвращать строку, но вместо этого Visual Studio, похоже, хочет импортировать ее как

void FindID(ref string SearchString)

не

string FindID(string SearchString)

Теперь я нашел решение (работает, но я не верю, что это "правильный" способ сделать это). Если я создаю новое сообщение

<message name="SecondOutput"> </message>

и измените функцию WSDL на

<operation name="FindID"> <documentation>Get ID For search</documentation> </operation>

Затем Visual Studio & SoapUI и PHP-страницы все счастливы и ведут себя нормально.

Так почему я не могу получить свое сообщение ввода и вывода как тот же самый тип???

1 ответ

Это ожидаемое поведение.

Когда вы говорите, что вы ожидаете, что он будет называться:

string MyResults = WebInterface.FindID(SearchString);

Это, по-видимому, просто предположение с вашей стороны.

В WSDL нет ничего, что бы категорически разрешить вам сделать это. Для целей интероперабельности следующие два метода семантически идентичны:

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

Структура.Net использует спецификацию WSDL для вывода сигнатур метода. Способ, которым он выбирает между двумя эквивалентами выше, - это изучение используемых сообщений. Поскольку одно и то же сообщение указано как для входных, так и для выходных параметров,.Net выводит (совершенно логически ИМХО), что первая подпись более правильно отражает намерение поставщика услуг.

licensed under cc by-sa 3.0 with attribution.