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 никогда не изменится).
Теперь у меня есть другая проблема, но она связана с пространством имен, поэтому я открою для этого новый вопрос.