Односторонний метод службы WCF с сообщением об ошибке
Я хотел создать односторонний метод для службы wcf. Все в порядке, если я не хочу возвращать сообщение об ошибке - если есть.
Я использую генератор синего кода wscf для файлов wsdl и контракта.
В операционном элементе wsdl у меня есть только дочерние элементы 'Input' и 'Fault'. Когда я запускаю службу, я получаю информацию, которая не может объявить сообщение об ошибке в односторонней связи и... одно из решений - установить одностороннее значение на ложное... то, что я сделал, и все работает нормально. Если происходит ошибка, я получаю сообщение.
Однако мне интересно, если бы я нарушил правила создания веб-службы /wsdl... Потому что из генератора схемы службы wsdl создает для меня одностороннюю связь (установлено значение 'true') и другие генераторы в других языках программирования, вероятно, будет делать то же самое...
Так это правильно, что я сделал? Как я могу изменить wsdl, чтобы генератор мог создать соответствующий код?
Если в теории я не могу использовать ошибку в односторонней связи, тогда нужна ли мне дополнительная структура в ответе, чтобы вернуть любую ошибку?
Спасибо!
3 ответа
Это правда, что односторонние операции не могут возвращать ошибки клиентам. Если вы хотите сгенерировать void
не односторонняя операция службы в WCF, вам придется добавить пустой выходной элемент для этой операции в ваш контракт WSDL.
Парсеры WSDL на основе.NET (такие как WSCF.blue и svcutil) будут генерировать односторонние сервисные операции для <wsdl:operation>
элементы, которые не имеют соответствующего <wsdl:output>
элемент.
Например, эта операция WSDL является односторонней:
<wsdl:definitions>
<wsdl:portType>
...
<wsdl:operation name="Foo">
<wsdl:input message="tns:FooRequest" />
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>
С другой стороны, определение операции с пустым <wsdl:output>
элемент (то есть тип XSD, содержащий пустую последовательность) будет сопоставлен с void
не односторонний метод в.NET, который может содержать объявление ошибки:
<wsdl:definitions>
<wsdl:portType>
...
<wsdl:operation name="Foo">
<wsdl:input message="tns:FooRequest" />
<wsdl:output message="tns:FooResponse" />
<wsdl:fault message="tns:FooFault" />
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>
где <tns:FooResponse>
тип просто определяется как:
<xs:element name="FooResponse">
<xs:complexType>
<xs:sequence/>
</xs:complexType>
</xs:element>
В WCF односторонняя означает, что операция не имеет возвращаемых значений, и клиент не заботится об успехе или неудаче вызова.
В WCF у нас также есть некоторые другие операции, которые, естественно, являются односторонними, например, вы управляете MSMQ через WCF, тогда операции обычно устанавливаются в одностороннем порядке.
Таким образом, если вы хотите вернуть что-то, чтобы указать статус вызова, то односторонний ответ не является правильным выбором, вы можете просто использовать обычную операцию wcf, которая не односторонняя.
Для односторонней операции, вот статья для вашей справки WCF ONE-WAY
Я чувствую, что ты все сделал правильно. Для любого типа клиента (C#, JAVA, C++, PHP) им просто нужен WSDL для создания прокси. Я чувствую, что это должно работать и на других языках. Лучше всего использовать SoapUI (Neutral Soap client) для тестирования вашего сервиса.