Ошибка WCF SOAP неверного типа

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

  • .Net 4.0 Приложение ASP.Net
  • Служба WCF с basicHttpBinding (soap 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

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

Борис


person Boris    schedule 15.01.2013    source источник


Ответы (1)


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

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

person Boris    schedule 24.01.2013