Прежде всего, вот моя установка:
- .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
Спасибо за вашу помощь, и не сомневайтесь, если вам понадобится дополнительная информация.
Борис