Односторонний метод службы WCF с сообщением об ошибке - PullRequest
3 голосов
/ 13 марта 2012

Я хотел создать односторонний метод для службы wcf.Все в порядке, если только я не хочу вернуть сообщение об ошибке - если есть.

Я использую генератор синего кода wscf для файлов wsdl и контракта.

В элементе операции wsdl у меня есть только «Ввод» и«Неисправные» дочерние элементы.Когда я запускаю службу, я получаю информацию, которая не может объявить сообщение об ошибке в односторонней связи и ... одно из решений - установить одностороннее значение на ложное ... то, что я сделал, и все работает нормально.Если возникает ошибка, я получаю сообщение.

Однако мне интересно, нарушил ли я правила создания веб-службы / wsdl ... Потому что из генератора схемы службы wsdl для меня создается односторонняя связь (установлено значение 'true') и другие генераторы других языков программирования, вероятно, сделали бы то же самое ...

Так правильно ли я поступил?Как я могу изменить wsdl, чтобы генератор мог соответствующим образом создать код?

Если в теории я не могу использовать ошибку в односторонней связи, то нужна ли мне дополнительная структура ответа для возврата любой ошибки?

Спасибо!

Ответы [ 3 ]

4 голосов
/ 13 марта 2012

Это правда, что односторонние операции не могут возвращать ошибки клиентам. Если вы хотите сгенерировать 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>
1 голос
/ 13 марта 2012

В WCF односторонняя операция означает, что операция не имеет возвращаемых значений, и клиент не заботится об успехе или неудаче вызова.

В WCF у нас также есть некоторые другие операции, которые, естественно, являются односторонними, например, вы управляете MSMQ через WCF, тогда операции обычно устанавливаются в одностороннем порядке.

Итак, если вы хотите вернуть что-то, указывающее статус вызова, то односторонний вывод не является правильным, вы можете просто использовать обычную операцию wcf, которая не односторонняя.

Для работы в одну сторону, вот статья для справки WCF ONE-WAY

0 голосов
/ 13 марта 2012

Я чувствую, что вы все сделали правильно.Для любого типа клиента (C #, JAVA, C ++, PHP) им просто нужен WSDL для создания прокси.Я чувствую, что это должно работать и на других языках.Лучше всего использовать SoapUI (Neutral Soap client) для тестирования вашего сервиса.

...