[ mmix @ 07.12.2011. 12:35 ] @
Ne lezi vraze, sad sam se ja zakucao sa WCF-non-WCF problemom a ne vidim od sume drvo. mozda je resenje abs ocigledno.

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>
    ...
 


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);
    ...
 


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)
          ...
 


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>