WCF SOAP Неправильный тип ошибки

Прежде всего, вот моя установка:

  • .Net 4.0 ASP.Net приложение
  • Служба WCF, с базовым HTTBBinding (мыло 1.1)
  • Ссылочный класс был сгенерирован с помощью svcutil, с параметрами /useSerializerForFaults; WSDL определяет все операции и предоставляет ссылки на файлы types.xsd и types_fault.xsd. К вашему сведению, файлы WSD и XSD являются общими для многих приложений, поэтому я не могу их изменить (если, конечно, нет серьезных ошибок проверки)

Моя проблема возникает, когда я отправляю сбой SOAP клиенту: я не могу получить доступ к правильному типу в коде, для детализации сбоя, поэтому клиент не может обработать этот сбой.

Вот выдержка из WSDL для вашего понимания:

<wsdl:message name="CreateScheduledWorkRequest">
            <wsdl:part name="parameters" element="root:CreateScheduledWork"/>
    </wsdl:message>
    <wsdl:message name="CreateScheduledWorkResponse">
            <wsdl:part name="parameters" element="root:CreateScheduledWorkResponse"/>
    </wsdl:message>
    <wsdl:message name="CreateScheduledWorkFault">
            <wsdl:part name="parameters" element="root:CreateScheduledWorkFault"/>
    </wsdl:message>

<wsdl:portType name="ManageScheduledWorkScheduledWorkManagement">
<wsdl:operation name="CreateScheduledWork">
                    <wsdl:input name="CreateScheduledWorkRequest" message="intf:CreateScheduledWorkRequest"/>
                    <wsdl:output name="CreateScheduledWorkResponse" message="intf:CreateScheduledWorkResponse"/>
                    <wsdl:fault name="CreateScheduledWorkFault" message="intf:CreateScheduledWorkFault"/>
            </wsdl:operation>
</wsdl:portType>

<wsdl:binding name="ManageScheduledWorkScheduledWorkManagementBinding"   type="intf:ManageScheduledWorkScheduledWorkManagement">
            <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
            <wsdl:operation name="CreateScheduledWork">
                    <wsdlsoap:operation soapAction="http://www.orange.com/MACHX/Interfaces/ManageScheduledWork/ScheduledWorkManagement/v1/CreateScheduledWork"/>
                    <wsdl:input name="CreateScheduledWorkRequest">
                            <wsdlsoap:body use="literal"/>
                    </wsdl:input>
                    <wsdl:output name="CreateScheduledWorkResponse">
                            <wsdlsoap:body use="literal"/>
                    </wsdl:output>
                    <wsdl:fault name="CreateScheduledWorkFault">
                            <wsdlsoap:fault name="CreateScheduledWorkFault" use="literal"/>
                    </wsdl:fault>
            </wsdl:operation>
</wsdl:binding>

Так, например, когда я отправляю ответ обратно (ошибок не было), я могу использовать элемент CreateScheduledWorkResponse и заполнить его правильно; но когда возникает FaultException, я могу только отправить обратно CreateScheduledWorkFaultMessage (а не CreateScheduledWorkFault). И клиент не может обработать этот тег...

Другими словами, тип CreateScheduledWorkFault недоступен в коде.

-> Я подозреваю, что что- то не так при генерации кода из WSDL и XSD с использованием svcutil, так как я не могу получить доступ к нужному типу в коде.

Я использую svcutil таким образом:

svcutil / useSerializerForFaults CSW.wsdl CSW.xsd CSW_Fault.xsd

Спасибо за вашу помощь, и не стесняйтесь, если вам нужно больше деталей.

Борис

1 ответ

Мое решение состояло в том, чтобы напрямую изменить тип в сгенерированном классе... это плохо, но в моей ситуации это был единственный выбор, который у меня был (обычно я никогда не должен регенерировать его, поскольку WSDL никогда не изменится).

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

Другие вопросы по тегам