2

我编写了一个 java axis2 1.4.1 Web 服务和 .net 3.5 WCF 客户端,我试图捕捉抛出的 wsdl 错误。

与 .net 2.0 不同,.net 3.5 声称支持wsdl:fault并且服务引用向导确实在客户端代理中生成所有正确的故障类。但是当我尝试捕捉错误时,它似乎没有正确序列化,所以我只能catch (FaultException ex)而不是我实际使用的类型FaultException<T>

我查看了我的reference.cs,我可以看到向导已将正确添加FaultContract到我的操作中。

[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);
    }

我还需要在 .net 中做些什么才能使其正常工作吗?还是 WCF 仅支持来自 .net Web 服务的自定义 wsdl 错误?

这是我的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>
4

3 回答 3

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?

于 2009-05-15T10:33:35.110 回答
1

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.

于 2009-05-15T10:39:41.710 回答
1

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

于 2009-05-15T14:10:40.687 回答