2

問題はこの質問に似ています。WCFFaultException<T>はJavaWebサービスFaultとの相互運用をサポートしていますか。ただし、私の場合、カスタム障害は実際にサービスから返されます。

これを説明するのは難しいですが、ここに行きます:

新しいWCFクライアントから、既存のJava Webサービス(他の種類のクライアントで何年もうまく機能している)を呼び出しています。サービスXSDは、1つのカスタム障害ServiceFaultを定義します。

<xs:complexType name="ServiceFault">
        <xs:annotation>
            <xs:documentation>On service error</xs:documentation>
        </xs:annotation>
        <xs:all>
            <xs:element name="ErrorCode" type="xs:string"/>
            <xs:element name="ErrorDescription" type="xs:string"/>
        </xs:all>
    </xs:complexType>

このServiceFaultは、より具体的なすべてのカスタム障害(MyMethodFaultなど)に使用されるため、次のようにすべてErrorCodeプロパティとErrorDescriptionプロパティを取得します。

<xs:element name="MyMethodFault" type="ServiceFault">
    <xs:annotation>
        <xs:documentation>On error in MyMethod</xs:documentation>
    </xs:annotation>
</xs:element>

次に、障害のWSDLメッセージが次のように定義されます。

<wsdl:message name="MyMethodFault">
<wsdl:part element="tns:MyMethodFault " name="MyMethodFault">
</wsdl:part>

そして最後に、操作は次のようにこれらの障害で定義されます。

<wsdl:fault message="tns:MyMethodFault" name="MyMethodFault">

これまでのところ、私には良さそうです。そして実行時に、サービスは次のように詳細SOAPタグで障害をきちんと返します。

<ns2:MyMethodFault xmlns:ns2="urn:salessystem:entity:MyService:v1.0">
<ns2:ErrorCode>1000</ns2:ErrorCode>
<ns2:ErrorDescription>TheErrorDescr</ns2:ErrorDescription>
</ns2:MyMethodFault>

ただし、SvcUtilは、より具体的なカスタムフォールトを生成せず、ServiceFaultのみを生成しました。これは、サービスリファレンスでのMyMethodFaultの唯一の言及です。

[OperationContractAttribute(Action = "", ReplyAction = "*")]
[FaultContractAttribute(typeof(sale...ServiceFault), Action="", Name="MyMethodFault")]        
[ServiceKnownTypeAttribute(typeof(ServiceFault))]
MyMethodResponse MyMethod(MyMethodRequest1 request);

だから、ここに問題があります:

MyMethodFaultが存在しないため、キャッチできませんFaultException<MyMethodFault>.。さらに、WCFは実行時にMyMethodFaultなどの特定のフォールトをServiceFaultにマップしないため、タイプの例外がFaultException<ServiceFault>キャッチされることはありません。したがって、エラーの説明は表示されません。

私は何か間違ったことをしていますか、それともWSDLまたはSvcUtil-usageを微調整する必要がありますか?

誰もが質問を理解できることを願っています:P

ありがとう、ビョルン

4

1 に答える 1

0

時々少しの休暇があなたが必要とするすべてです。問題が解決しました:

SvcUtilは、一般的なカスタム障害ServiceFaultに対して1つではなく、2つのC#タイプを生成しました。もう1つは、名前空間階層のより深い位置にありました。そして、他の障害をキャッチしようとすると、うまく機能します。より具体的なカスタム障害(XSDのServiceFaultから派生)がすべてここで検出され、エラーコードと障害の説明を確認できます。今必要なのはそれだけです。

ただし、XSDで説明されているMyMethodFaultなどのより具体的なカスタム障害用に生成されたC#タイプはまだありません。しかし、多分私はそうするべきではありません!

上記のコード例で説明できなかったことは、SOAP応答の特定の障害MyMethodFaultのXMLが、返された障害のDetailタグ内にあることです。

<SOAP-ENV:Fault>
  <faultcode>SOAP-ENV:Server</faultcode>
  <faultstring xml:lang="en">ServiceException</faultstring>
  <detail>
    <ns2:MyMethodFault xmlns:ns2="urn:salessystem:entity:MyService:v1.0">
      <ns2:ErrorCode>1000</ns2:ErrorCode>
      <ns2:ErrorDescription>My+Error+Description</ns2:ErrorDescription>
    </ns2:UcsAgreemenFault>
  </detail>
</SOAP-ENV:Fault>

この障害は、try/catchの「ベース」ServiceFaultにマップされます。上記のSOAPでは、特定の障害のタイプまたは名前を明確に確認できます。ただし、例外がキャッチされたときにそのタイプ/名前を取得する方法はわかりません。私が見るのはErrorCodeとErrorDescriptionだけです。ただし、ServiceFaultをキャッチしてコードと説明を確認できる限り、すべて問題ありません。

このコメントやその他のコメントにご意見をお寄せいただきありがとうございます。

/Björn

于 2012-08-02T13:56:27.847 に答える