0

カスタムオブジェクトを返すWebサービスからの例外をどのようにキャッチしますか?

私はこの投稿を見ましたが、サービスによってスローされた例外を取得する方法を示していないようです。

SOAP例外をプルすることはできますが、Webサービスが返した元の例外を取得できるようにしたいです。この時点で設定されている変数を確認しましたが、どこにも例外が表示されていないようです。次のように表示されます。

"Server was unable to process request. ---> Exception of type 
    'RestoreCommon.ConsignmentNotFoundException' was thrown."

    try
    {
        Consignment cons = WebServiceRequest.Instance.Service
            .getConsignmentDetails(txtConsignmentNumber.Text);
            lblReceiverName.Text = cons.Receiver.Name;
    }
    catch (ConsignmentNotFoundException)
    {
        MessageBox.Show("Consignment could not be found!");
    }

これは可能ですか?

4

1 に答える 1

1

要するに、違います。

Webサービスは常にSOAP障害をスローします。あなたのコードでは、

  1. MessageBoxは、Windowsフォームで使用することを目的としており、他の場所では使用できません。
  2. この例外をスローすることができ、クライアントアプリケーションでは、SOAP障害を処理する必要があります。

編集:クライアントに例外を送信したくない場合は、次のように実行できます。

class BaseResponse
    {
        public bool HasErrors
        {
            get;
            set;
        }

        public Collection<String> Errors
        {
            get;
            set;
        }
    }

各WebMethod応答は、このクラスから継承する必要があります。これで、WebMethodブロックは次のようになります。

public ConcreteResponse SomeWebMethod()
        {
            ConcreteResponse response = new ConcreteResponse();

            try
            {
                // Processing here
            }
            catch (Exception exception)
            {
                // Log the actual exception details somewhere

                // Replace the exception with user friendly message
                response.HasErrors = true;
                response.Errors = new Collection<string>();

                response.Errors[0] = exception.Message;
            }
            finally
            {
                // Clean ups here
            }

            return response;
        }

これは単なる例です。単に一般的なcatchブロックを使用するのではなく、適切な例外処理コードを作成する必要がある場合があります。

注:これにより、アプリケーションでのみ発生する例外が処理されます。クライアントとサービス間の通信中に発生した例外は、引き続きクライアントアプリケーションにスローされます。

于 2012-07-17T02:45:23.570 に答える