1

.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>&lt;![CDATA[&lt;error xmlns="urn:company:schema:errordetail:v01"&gt;&lt;errorCode&gt;1000&lt;/errorCode&gt;&lt;highestSeverity&gt;8&lt;/highestSeverity&gt;&lt;errorDetails count="1"&gt;&lt;errorDetail&gt;&lt;errorType&gt;1&lt;/errorType&gt;&lt;errorSeverity&gt;8&lt;/errorSeverity&gt;&lt;errorDescription&gt;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.&lt;/errorDescription&gt;&lt;errorNamespace&gt;urn:company:schema:sendinvoice:rq:v01&lt;/errorNamespace&gt;&lt;errorNode&gt;CompanyName&lt;/errorNode&gt;&lt;errorLine&gt;1&lt;/errorLine&gt;&lt;errorColumn&gt;2556&lt;/errorColumn&gt;&lt;errorXPath/&gt;&lt;errorSource/&gt;&lt;/errorDetail&gt;&lt;/errorDetails&gt;&lt;/error&gt;]]&gt;</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 サービスと通信できない理由がわかりません。このユーザーにも同様の問題がありましたが、トレースで障害の詳細を確認できるため、彼の問題の理由は私のものと同じではありません。

どんな助けでもありがたく受け取られます。

4

1 に答える 1

0

カスタムFaultタイプのWSDLで指定された名前空間が、発生していた障害名前空間と一致しませんでした。その結果、.NETクライアントは障害を正しく逆シリアル化できませんでした。

つまり、サードパーティ企業は、WSDLを変更するか、発生しているエラーの名前空間を変更する必要があります。

このような問題の根底に到達するのに役立つ最も便利なツールは、トレースを設定することです:http: //msdn.microsoft.com/en-us/library/ms732023.aspx

于 2010-05-06T06:48:05.383 に答える