2009-08-18 28 views
9

カスタム例外を作成したWebサービスがあります。この例外の名前がInvalidContractExceptionであるとしましょう。ASMX Webサービスからカスタム例外をキャッチ

私がしたいのは、特定のステップが発生した場合、この例外をスローすることです。しかし、クライアントが正しく処理するためにInvalidContractExceptionをキャッチする方法を理解できません。

この

は、ASP.Net Webサービスが障害をスローWCFサービスへのクライアント・コールではC#の

答えて

17

  1. Webサービスは、SOAPフォルトを行います。例外はプラットフォーム固有です。
  2. ASMX Webサービスで例外が処理されないと、.NETはその例外をSOAPフォールトに変換します。例外の詳細はシリアル化されていません。
  3. ASMXクライアントでは、SOAP障害がSoapExceptionに変換されます。

ASMX Webサービスでは、SOAPフォルトが適切にサポートされていません。クライアント側でSoapException以外の例外を取得する方法はありません。

さらにWCFにアップグレードする別の理由。あなたはASMXで行うことができないものの例として


、ここでWCFがどのように動作するかです。 WCFは、あなたがそれを返すことができた欠陥、各Webサービス操作のために、指定することができます:

[ServiceContract] 
public interface IMyServiceContract 
{ 
    [FaultContract(typeof(IntegerZeroFault))] 
    [FaultContract(typeof(SomeOtherFault))] 
    [OperationContract] 
    public string GetSomeString(int someInteger); 
} 

[DataContract] 
public class IntegerZeroFault 
{ 
    [DataMember] 
    public string WhichInteger {get;set;} 
} 

[DataContract] 
public class SomeOtherFault 
{ 
    [DataMember] 
    public string ErrorMessage {get;set;} 
} 

public class MyService : IMyServiceContract 
{ 
    public string GetSomeString(int someInteger) 
    { 
     if (someInteger == 0) 
      throw new FaultException<IntegerZeroFault>(
       new IntegerZeroFault{WhichInteger="someInteger"}); 
     if (someInteger != 42) 
      throw new FaultException<SomeOtherFault>(
       new SomeOtherFault{ErrorMessage ="That's not the anaswer"}); 
     return "Don't panic"; 
    } 
} 

WCFクライアントは、その後、たとえば、FaultException<SomeOtherFault>をキャッチすることができます。これをJavaクライアントで試したところ、SomeOtherFaultを取得できました.IBM Rational Web Developerは、Java Exceptionクラスから派生させるために作成しました。

0

で書かれている、あなたは

を行う(FaultExceptionとして..

キャッチ障害を試してみてくださいYourService.FooBarFaultの)

エンドあなたが目を生成することができ、サービスメソッドのFaultContractを宣言する必要が

を試してみてください例えば、あなたがこれを行うことはできません

_

<FaultContract(GetType(FooBarFault))> _ 

Function yourCall 
+0

彼はASMXを使用しています。彼はそれを "ASP.NET Web Services"と呼びます。 –

+0

ああ、私は彼がWCFを使っていると思っていました –

5

あなたが何かが間違っていたことをユーザーが知ることができるように例外をスローすることが目的ならば、特定の例外が発生し、特別な処理があります。クライアントプロキシの正しい実装に頼らざるを得ません(実際には、クライアントプロキシを自分自身に提供することもできます)。

SoapExceptionさんの作品について役に立つ記事があります。here

本質的には、SoapExceptionの詳細ノードで例外の詳細(たとえばエラーコード)をエンコードしてから、例外を再発行する前にクライアント側で解析します。

サービス境界を越えてスローされたように例外を再作成する方法はなく、クライアント側でSoapException以外の何かを取得する自動方法はありません。