Tutorial :Does WCF FaultException support interop with a Java web service Fault



Question:

I have written a java axis2 1.4.1 web service and .net 3.5 WCF client and I am trying to catch the wsdl faults thrown.

Unlike .net 2.0 the .net 3.5 claims to support wsdl:fault and the service reference wizard does generate all the correct fault classes in the client proxy. But when I try to catch a fault it doesn't seem to correctly serialise so that I can only catch (FaultException ex) and not the type I actually threw using FaultException<T>

I had a look inside my reference.cs I can see wizard has added correct FaultContract to the my opeation.

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]  [System.ServiceModel.ServiceContractAttribute(Namespace="http://www.mycomp.com/wsdl/Foo", ConfigurationName="FooServiceProxy.Foo")]  public interface Foo {            [System.ServiceModel.OperationContractAttribute(Action="http://www.mycomp.com/Foo/list", ReplyAction="*")]   [System.ServiceModel.FaultContractAttribute(typeof(TestWsdlFaultsApp.FooServiceProxy.SimpleFault), Action="http://www.mycomp.com/Foo/list", Name="simpleFault")]          [System.ServiceModel.XmlSerializerFormatAttribute()]          TestWsdlFaultsApp.FooServiceProxy.listResponse list(TestWsdlFaultsApp.FooServiceProxy.listRequest request);      }  

Is there something else I need to do in .net to get this to work? or does WCF only support custom wsdl faults from a .net web service ?

Heres my wsdl

<?xml version="1.0" encoding="UTF-8"?>  <?xml-stylesheet type="text/xsl" href="wsdl-viewer.xsl"?>  <wsdl:definitions name="FooImplDefinitions"        targetNamespace="http://www.mycomp.com/wsdl/Foo"        xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"        xmlns:tns="http://www.mycomp.com/wsdl/Foo"        xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"        xmlns:xs="http://www.w3.org/2001/XMLSchema">          <!-- TYPES -->        <wsdl:types>              <xs:schema targetNamespace="http://www.mycomp.com/wsdl/Foo"                    elementFormDefault="qualified" attributeFormDefault="unqualified"                    xmlns:security="http://www.mycomp.com/xsd/types/Security">                      <!-- IMPORTS -->                    <xs:import namespace="http://www.mycomp.com/xsd/types/Foo"                          schemaLocation="Foo.xsd" />                     <xs:import namespace="http://www.mycomp.com/xsd/types/Security"                          schemaLocation="Security.xsd" />                      <!-- HEADER ELEMENTS -->                    <xs:element name="identity" type="security:TrustedIdentity" />                      <!-- REQUEST/RESPONSE ELEMENTS -->                    <xs:element name="listRequest">                          <xs:complexType>                                <xs:sequence>                                      <xs:element name="action" type="xs:string" />                                </xs:sequence>                          </xs:complexType>                    </xs:element>                    <xs:element name="listResponse">                          <xs:complexType>                                <xs:sequence>                                      <xs:element name="stuff" type="xs:string" />                                </xs:sequence>                          </xs:complexType>                    </xs:element>                      <!-- FAULT TYPES  -->                    <xs:complexType name="SimpleFault">                          <xs:sequence>                                <xs:element name="reason" type="xs:string"/>                          </xs:sequence>                    </xs:complexType>                      <!-- FAULT ELEMENTS -->                    <xs:element name="simpleFault" type="tns:SimpleFault"/>              </xs:schema>        </wsdl:types>          <!-- MESSAGES -->        <wsdl:message name="listRequest">              <wsdl:part element="tns:listRequest" name="parameters" />              <wsdl:part element="tns:identity" name="header" />        </wsdl:message>        <wsdl:message name="listResponse">              <wsdl:part element="tns:listResponse" name="return" />        </wsdl:message>        <wsdl:message name="simpleException">              <wsdl:part element="tns:simpleFault" name="fault"/>        </wsdl:message>          <!-- PORT TYPES -->        <wsdl:portType name="Foo">              <wsdl:operation name="list">                    <wsdl:input message="tns:listRequest" />                    <wsdl:output message="tns:listResponse" />                    <wsdl:fault name="simpleFault" message="tns:simpleException" />              </wsdl:operation>        </wsdl:portType>          <!-- BINDINGS -->        <wsdl:binding name="FooBinding" type="tns:Foo">              <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />              <wsdl:operation name="list">                    <soap:operation soapAction="http://www.mycomp.com/Foo/list" />                    <wsdl:input>                          <soap:header message="tns:listRequest" part="header" use="literal" />                          <soap:body parts="parameters" use="literal" />                    </wsdl:input>                    <wsdl:output>                          <soap:body use="literal" />                    </wsdl:output>                    <wsdl:fault name="simpleFault">                          <soap:fault name="simpleFault" use="literal" />                    </wsdl:fault>              </wsdl:operation>        </wsdl:binding>          <!-- SERVICES -->        <wsdl:service name="FooServiceImpl">              <wsdl:port name="FooPort" binding="tns:FooBinding">                    <soap:address                          location="http://localhost:9001/Foo/FooServiceImpl" />              </wsdl:port>        </wsdl:service>    </wsdl:definitions>  


Solution:1

WCF should work with axis2 exceptions. I had it working, but I don't remember all the details.

When you use SOAP monitor or something like that, what do you see in the fault message body?


Solution:2

If you're not catching the FaultException<T>, that means you're likely not sending it. Be careful of the XML namespace being used. Take a look at what you're sending, using Fiddler or something like it.

FaultException<T> works fine with Java, or even with WCF.


Solution:3

Thanks john you set me on the right path, Problem was obvious: I was not setting the detail when I threw the fault in java (axis2).

DODGY CODE:

throw new SimpleException("SimpleFault thrown");  

WORKING CODE:

 SimpleFault fault = new SimpleFault();   fault.setReason("SimpleFault reason");     SimpleFaultE faultMessage = new SimpleFaultE();   faultMessage.setSimpleFault(fault);     SimpleException ex = new SimpleException("SimpleFault thrown");   ex.setFaultMessage(faultMessage);     throw ex;  

So AXIS2 -> WCF wsdl:fault interop works just fine...


Note:If u also have question or solution just comment us below or mail us on toontricks1994@gmail.com
Previous
Next Post »