.NET Web サービス クライアントを使用して Java Axis2 Web サービスに接続しています。クライアント自体は、.NET 3.5 フレームワークを対象としています。クライアント DLL をラップするアプリケーションは 2.0 です。それが何か関係があるかどうかはわかりません。
電子メールで WSDL と XSD を受け取りました。それらから、svcutil を使用してプロキシ クラスを構築しました。メッセージを正常に送信できますが、問題が発生したときに正しいエラーを検出できません。以下の例では、エラーは常に一般的な FaultException によって検出されます。
catch (FaultException<InvoiceErrorType> fex)
{
OnLog(enLogLevel.ERROR, fex.Detail.ErrorDescription);
}
catch (FaultException gfex)
{
OnLog(enLogLevel.ERROR, gfex.Message);
}
プロキシ クライアントは、FaultContract に適切な属性を持っているようです。
// CODEGEN: Generating message contract since the operation SendInvoiceProvider_Prod is neither RPC nor document wrapped.
[OperationContractAttribute(Action = "https://private/SendInvoiceProvider", ReplyAction = "*")]
[FaultContractAttribute(typeof(InvoiceErrorType), Action = "https://private/SendInvoiceProvider", Name = "InvoiceError", Namespace = "urn:company:schema:entities:base")]
[XmlSerializerFormatAttribute(SupportFaults = true)]
[ServiceKnownTypeAttribute(typeof(ItemDetail))]
[ServiceKnownTypeAttribute(typeof(Supplier))]
OutboundComponent.SendInvoiceProviderResponse SendInvoiceProvider_Prod(OutboundComponent.SendInvoiceProvider_Request request);
トレースを有効にして、障害の内容が戻ってくるのを確認できますが、.NET はそれを InvoiceError として認識していません。完全な SOAP 障害は次のとおりです。
<soapenv:Fault>
<faultcode xmlns="">soapenv:Client</faultcode>
<faultstring xmlns="">Message found to be invalid</faultstring>
<faultactor xmlns="">urn:SendInvoiceProvider</faultactor>
<detail xmlns="">
<InvoiceError xmlns="urn:company:schema:entities:common:invoiceerror:v01">
<ErrorID>100040</ErrorID>
<ErrorType>UNEXPECTED</ErrorType>
<ErrorDescription><![CDATA[<error xmlns="urn:company:schema:errordetail:v01"><errorCode>1000</errorCode><highestSeverity>8</highestSeverity><errorDetails count="1"><errorDetail><errorType>1</errorType><errorSeverity>8</errorSeverity><errorDescription>cvc-complex-type.2.4.a: Invalid content was found starting with element 'CompanyName'. One of '{"urn:company:schema:sendinvoice:rq:v01":RoleType}' is expected.</errorDescription><errorNamespace>urn:company:schema:sendinvoice:rq:v01</errorNamespace><errorNode>CompanyName</errorNode><errorLine>1</errorLine><errorColumn>2556</errorColumn><errorXPath/><errorSource/></errorDetail></errorDetails></error>]]></ErrorDescription>
<TimeStamp>2010-05-04T21:12:10Z</TimeStamp>
</InvoiceError>
</detail>
</soapenv:Fault>
エラーで定義されている名前空間に気付きました:
<InvoiceError xmlns="urn:company:schema:entities:common:invoiceerror:v01">
これは、生成されたプロキシ クラスや WSDL のどこにも見られません。インターフェイス WSDL は、エラー スキーマの名前空間を次のように定義します。
<xs:import namespace="urn:company:schema:entities:base" schemaLocation="InvoiceError.xsd"/>
これが、.NET クライアントが型指定された Fault Exception を正しく解析できない理由でしょうか?
Web サービス自体を制御することはできません。.NET が Java Axis2 Web サービスと通信できない理由がわかりません。このユーザーにも同様の問題がありましたが、トレースで障害の詳細を確認できるため、彼の問題の理由は私のものと同じではありません。
どんな助けでもありがたく受け取られます。