首先,这是我的设置:
- .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 类型。
--> 我怀疑使用 svcutil 从 WSDL 和 XSD 生成代码时出现问题,因为我无法访问代码中所需的类型。
我以这种方式使用 svcutil:
svcutil /useSerializerForFaults CSW.wsdl CSW.xsd CSW_Fault.xsd
感谢您的帮助,如果您需要更多详细信息,请不要犹豫。
鲍里斯