Операция SOAP с одинаковыми входными и выходными сообщениями создает нечетную подпись метода прокси - PullRequest
0 голосов
/ 10 марта 2012

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

Проблема, с которой я столкнулся, связана с несколькими операциями, которые имеют один и тот же тип ввода какТип вывода.

Пример

<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 функции FindID работают должным образом на страницах PHP, которые используютэта функция работает должным образом.

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

string MyResults = WebInterface.FindID(SearchString);

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

void FindID(ref string SearchString) 

, а не

string FindID(string SearchString)

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

<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 & SoapUI и страницы PHP все довольны и ведут себя нормально.

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

1 Ответ

2 голосов
/ 10 марта 2012

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

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

string MyResults = WebInterface.FindID(SearchString);

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

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

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

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

...