Dakle,
imam non-WCF server koji pozivam iz WCF klijenta i treba mi pristup fault u slucaju da ga server vrati. Mogu da koristim primer sa SO: "How to access SOAP 1.1 fault detail from WCF client (no fault contract)" ali taj nacin mi je zesce mucenje sa obzirom na to da WSDL definise fault contract:
Code (xml):
<wsdl:types>
<schema elementFormDefault="qualified" targetNamespace="http://www.cisco.com/BTS10200/i01" xmlns="http://www.w3.org/2001/XMLSchema">
...
<complexType name="BtsSoapException">
<sequence>
<element name="error_code" type="xsd:int"/>
<element name="error_string" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<element name="fault" type="impl:BtsSoapException"/>
...
<wsdl:message name="BtsSoapException">
<wsdl:part element="impl:fault" name="fault"/>
</wsdl:message>
...
<wsdl:portType name="Bts10200Operations">
<wsdl:operation name="login">
<wsdl:input message="impl:loginRequest" name="loginRequest"/>
<wsdl:output message="impl:loginResponse" name="loginResponse"/>
<wsdl:fault message="impl:BtsSoapException" name="BtsSoapException"/>
</wsdl:operation>
...
<wsdl:types>
<schema elementFormDefault="qualified" targetNamespace="http://www.cisco.com/BTS10200/i01" xmlns="http://www.w3.org/2001/XMLSchema">
...
<complexType name="BtsSoapException">
<sequence>
<element name="error_code" type="xsd:int"/>
<element name="error_string" nillable="true" type="xsd:string"/>
</sequence>
</complexType>
<element name="fault" type="impl:BtsSoapException"/>
...
<wsdl:message name="BtsSoapException">
<wsdl:part element="impl:fault" name="fault"/>
</wsdl:message>
...
<wsdl:portType name="Bts10200Operations">
<wsdl:operation name="login">
<wsdl:input message="impl:loginRequest" name="loginRequest"/>
<wsdl:output message="impl:loginResponse" name="loginResponse"/>
<wsdl:fault message="impl:BtsSoapException" name="BtsSoapException"/>
</wsdl:operation>
...
Import servisa generise odgovarajuce konstrukte:
Code (csharp):
[System.Runtime.Serialization.DataContractAttribute(Name="BtsSoapException", Namespace="http://www.cisco.com/BTS10200/i01")]
[System.SerializableAttribute()]
public partial class BtsSoapException : object ...
....
[System.ServiceModel.ServiceContractAttribute(Namespace="http://www.cisco.com/BTS10200/i01", ConfigurationName="CiscoBTSService.Bts10200Operations")]
public interface Bts10200Operations {
[System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
[System.ServiceModel.FaultContractAttribute(typeof(TestCiscoBTS.CiscoBTSService.BtsSoapException), Action="", Name="fault")]
TestCiscoBTS.CiscoBTSService.loginResponse login(TestCiscoBTS.CiscoBTSService.loginRequest request);
...
[System.Runtime.Serialization.DataContractAttribute(Name="BtsSoapException", Namespace="http://www.cisco.com/BTS10200/i01")]
[System.SerializableAttribute()]
public partial class BtsSoapException : object ...
....
[System.ServiceModel.ServiceContractAttribute(Namespace="http://www.cisco.com/BTS10200/i01", ConfigurationName="CiscoBTSService.Bts10200Operations")]
public interface Bts10200Operations {
[System.ServiceModel.OperationContractAttribute(Action="", ReplyAction="*")]
[System.ServiceModel.FaultContractAttribute(typeof(TestCiscoBTS.CiscoBTSService.BtsSoapException), Action="", Name="fault")]
TestCiscoBTS.CiscoBTSService.loginResponse login(TestCiscoBTS.CiscoBTSService.loginRequest request);
...
kad pozovem login() sa pogresnim userom dobijem soap fault u raw odgovoru:
Code (xml):
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server.generalException</faultcode>
<faultstring></faultstring>
<detail>
<ns1:fault xmlns:ns1="http://www.cisco.com/BTS10200/i01">
<error_code>401</error_code>
<error_string xsi:type="xsd:string">java.lang.Exception: No user profile defined in the database for fakeuser</error_string>
</ns1:fault>
<ns2:exceptionName xmlns:ns2="http://xml.apache.org/axis/">com.sswitch.oam.soap.intf.BtsSoapException</ns2:exceptionName>
<ns3:stackTrace xmlns:ns3="http://xml.apache.org/axis/">
at com.sswitch.oam.soap.impl.UserAuth.validateUser(UserAuth.java:63)
...
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<soapenv:Fault>
<faultcode>soapenv:Server.generalException</faultcode>
<faultstring></faultstring>
<detail>
<ns1:fault xmlns:ns1="http://www.cisco.com/BTS10200/i01">
<error_code>401</error_code>
<error_string xsi:type="xsd:string">java.lang.Exception: No user profile defined in the database for fakeuser</error_string>
</ns1:fault>
<ns2:exceptionName xmlns:ns2="http://xml.apache.org/axis/">com.sswitch.oam.soap.intf.BtsSoapException</ns2:exceptionName>
<ns3:stackTrace xmlns:ns3="http://xml.apache.org/axis/">
at com.sswitch.oam.soap.impl.UserAuth.validateUser(UserAuth.java:63)
...
I FaultException se digne kao sto treba, ali nije FaultException<BtsSoapException>?!? Kao da WCF uopste ne prepoznaje fault i ne deserijalizuje ga. Sta radim pogresno? Kako da umesto FaultException dobijem FaultException<BtsSoapException>
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić
naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji
je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan,
sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv - Z.Đinđić