Односторонний метод службы WCF с сообщением об ошибке
Вопрос
Я хотел создать односторонний метод для службы wcf.Все в порядке, если я не хочу вернуть сообщение о неисправности - если таковые имеются.
Я использую генератор синего кода wscf для файлов wsdl и контрактов.
В элементе операции wsdl у меня есть только дочерние элементы «Вход» и «Ошибка».Когда я запускаю службу, я получил информацию, которая не может объявить сообщение о неисправности при односторонней связи и..одно из решений — установить одностороннее значение false..что я сделал, и все работает нормально.Если произойдет ошибка, я получу сообщение.
Однако мне интересно, нарушил ли я правила создания веб-сервиса/wsdl...Поскольку генератор схемы службы wsdl создает для меня одностороннюю связь (установленную в значение «истина»), а другие генераторы на других языках программирования, вероятно, будут делать то же самое...
Так правильно ли то, что я сделал?Как я могу изменить wsdl, чтобы генератор мог правильно создавать код?
Если теоретически я не могу использовать ошибку при односторонней связи, тогда нужна ли мне дополнительная структура ответа, чтобы вернуть какую-либо ошибку?
Спасибо!
Решение
Это правда, что односторонние операции не могут возвращать ошибки клиентам.Если вы хотите создать void
не в одну сторону операция службы в WCF, вам придется добавить пустой выходной элемент для этой операции в вашем контракте WSDL.
Парсеры WSDL на базе .NET (например, WSCF.синий и 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, которая не является односторонним.
для односторонней операции, вот статья для вашей справки
Я чувствую, что ты правильно.Для любого типа клиента (C #, Java, C ++, PHP) им просто нужно WSDL для создания прокси.Я чувствую, что это должно работать на других языках.Лучше всего использовать SOAPUI (нейтральный мыльный клиент) для проверки вашего сервиса.