JavaのWebサービスの障害とWCF FaultException サポート相互運用を行います
質問
私は、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内部を見ていたが、私のopeationに正しい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>
解決 3
ジョンはあなたが正しい道に私を設定するおかげで、問題は明らかだった:私は、Java(のAxis2)の障害を投げたとき、私は、詳細を設定していませんでした。
危険な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;
AXIS2ので - > WCFのWSDL:障害相互運用機能が正常に動作します...
他のヒント
WCFは、Axis2の例外で動作するはずです。私はそれが働いていたが、私はすべての詳細を覚えていません。
あなたはSOAPモニタまたはそのようなものを使用すると、あなたは障害メッセージの本文に何を見ていますか?
あなたはFaultException<T>
をキャッチしていない場合は、それはあなたがおそらくそれを送っていないことを意味します。使用されているXML名前空間に注意してください。あなたはそれのようにバイオリンか何かを使用して、送信しているものを見てみましょう。
FaultException<T>
は、Javaとの、あるいはWCFで正常に動作します。