2009-07-20 12 views
6

私のWebサービスメソッドは、コレクションオブジェクトを返します。これは、C#Webサービスの動作のおかげでうまくシリアル化されます!ASMX Webサービスからエラーを戻す方法は?

しかし、私のコードがキャッチされない例外をスローした場合、私が代わりにカスタムエラーオブジェクトを返すようにしたいです。

は、C#のASP.NET V2を使用して可能このですか?例えば

正常動作が返す必要があります:

<Books> 
    <book>Sample</book> 
    <book>Sample</book> 
</Books> 

しかし、エラーのを私は

<error> 
     <errorMessage></errorMessage> 
    </error> 
+0

ASMX WebサービスはSOAPフォルトを適切にサポートしていないことに注意してください。生成されたWSDLはフォールトを定義しないため、一部のクライアントはそれらを無視したり、受信時に致命的なエラーを返したりします。この問題を回避するには、代わりにWCFを使用します。 –

答えて

7

はい、これが可能であるしたいです。あなたに見てする必要がありますどのような

SoapException class、特にthrows SOAPException指定クラスのDetail propertyです。

SoapExceptionクラスは、エラー情報をWebサービスメソッドからクライアント/コンシューマに返すための標準準拠のメカニズムである "Soap Fault"を効果的にレンダリングします。

SoapExceptionクラスの「詳細」プロパティは、タイプがXmlNodeであるため、単一のノード/要素または子ノードの階層のいずれかを含むことができます。したがって、詳細ノードは、独自のカスタムエラーオブジェクトのシリアライズされた表現の「親」として、容易に含まれ、機能することができます。 MSDNから

を詳細プロパティがSOAPリクエストのBody要素に関連するアプリケーション固有のエラーの詳細を供給するためのものです。 SOAP仕様によれば、SOAPリクエストのBody要素のためにクライアント要求を処理できなかったためにエラーが発生した場合、Detailプロパティを設定する必要があります。 SOAP要求のヘッダーエントリにエラーが発生した場合は、SOAPヘッダーにエラーの詳細が返されるようにSoapHeaderExceptionをスローする必要があります。 Body要素の処理によってエラーが発生しなかった場合は、Detailプロパティを設定しないでください。詳細プロパティのためのXmlNodeを建物内

、DetailElementNameの名前と名前空間プロパティは、SOAP仕様での[sic]、一貫性を保つを確実にするために使用することができます。詳細要素の

すべての直接の子要素は、詳細エントリと呼ばれ、各詳細項目はdetail要素内の独立した要素として符号化されます。

あなたが正しくあなたのWebサービスのレスポンスに準拠SOAPままにしたい場合は、エラーは、元のXML要求のクライアントのヘッダ部内で発生た場合、あなたはSoapHeaderExceptionではなくthrows SOAPException指定を返却する必要がありますことをご注意(これは、多くの場合、セキュリティ資格などにcustom SOAP headersを使用する場合に当てはまります)。

+0

例を教えてください。 –

+0

@JL - 私の答え(最初のリンク)のSoapExceptionクラスリンクには、VBとC#の両方で "カスタム"エラーメッセージをスローするサンプルコードが含まれています。おそらく、System.Xml.Serialization.XmlSerializerクラスを使用して、独自のオブジェクトをシリアライズすることによって作成されたいくつかのXmlによって、XmlNodeオブジェクトを手動で作成して追加することによってDetailプロパティを作成します。ここをクリックしてください:http://support.microsoft.com/kb/815813 – CraigTP

+0

絶対完璧な答え!ありがとうCraig ...私は非常に標準のSOAP例外と一緒に行くカスタムエラーオブジェクトを返そうとする人をお勧めします。その標準化されたので、そのような行動を取るのは簡単です。 –

関連する問題