9

WebServiceExceptionサービス クライアントによってスローされたすべての を処理したいと考えています。これを今すぐ行う良い方法はありますか?

たとえば、Windows フォーム アプリの周りに単一の ServiceClientBase を渡しています。httpヘッダーでサーバーにAPIキーを渡しています。API キーが無効であるという要求については、要求が承認されていないため、API キーを設定する必要があることをユーザーに通知するメッセージ ボックスを表示したいと考えています。しかし、私はこのコードをどこにでも置きたくありません:

try
{
    _client.Get(new ReqDto());
}
catch (WebServiceException ex)
{
    if(ex.StatusCode == 401)
        Util.ShowUnauthorizedMessageBox();
}

このようなものがいいでしょう:

_client.WebServiceExceptionHandler += TheHandler;

フックできるローカル応答フィルターがあることはわかっていますが、実体化された WebServiceException が必要です。

ServiceClientBase.cs を調べて何ができるかを確認していますが、助けていただければ幸いです。ありがとう。

4

2 に答える 2

2

これを API の問題ではなく設計上の問題として考えるとしたら、答えはサービス クライアントをラップすることです。個人的には、同様のことを行ったので、クライアントでサービスの例外をログに記録できます。

これは出発点になる可能性があります。

public class MyServiceClient : IDisposable
{
    public ServiceClientBase ServiceClient { get; set; }

    string _serviceUri;
    public string ServiceUri
    {
        get { return _serviceUri; }
        set { _serviceUri = value; ServiceUriChanged(); }
    }

    public MyServiceClient()
    {
        ServiceUri = "http://127.0.0.1:8080";
    }

    public void Dispose()
    {
        ServiceClient.Dispose();
    }

    public TResponse Get<TResponse>(IReturn<TResponse> request)
    {
        try
        {
            return ServiceClient.Get(request);
        }
        catch (WebServiceException ex)
        {
            if(ex.StatusCode == 401)
                Util.ShowUnauthorizedMessageBox();
        }
    }

    void ServiceUriChanged()
    {
        if (ServiceClient != null)
            ServiceClient.Dispose();
        ServiceClient = new JsonServiceClient(ServiceUri);
    }
}

時間の経過とともに、ローカル キャッシングの追加、すべてのリクエストとレスポンスの [デバッグ コンソールへの] ログ記録など、この追加レベルの間接化に他の利点が見つかるかもしれません。そして、すべてのクライアント コードで使用されるようになると、維持するのにかなりの費用がかかります。

APIに関する限り、あなたが望むものを提供しているとは思いません。個人的には、そのままで満足しています (特に、IReturn<T>必要な機能を統合するときにインターフェイスが役立つため)。しかし、これに満足できない場合は、プル リクエスト 1 つで、Demisとの改善に関する対話を行うことができます。(-=

于 2013-05-10T19:50:31.537 に答える