3

WCF サービスへの非同期呼び出しを行う必要がある Web サイトがあります。各呼び出しを try-catch ブロックでラップして、TimeoutExceptions と CommunicationExceptions を処理できるようにします。

ただし、サービスを呼び出すたびに、まったく同じ try-catch ブロックをコピーして貼り付けたいわけではありません。デリゲートを使用して try-catch ブロックを 1 回だけ書き込む方法はありますか? また、例外メッセージもキャプチャしたいと考えています。

私はそれを次のように呼びたい:

// This method returns void
TryCatchHelper(x => x.WCFMethod1(param1, param2));

// This method has a return value but no params
var returnValue = TryCatchHelper(x => x.WCFMethod2());

編集:私のコードは次のようになります:

User GetUser(int Id)
{
    User returnUser = null;

    try
    {
        // Open WCF channel, etc.
        returnUser = myWCFClient.GetUser(Id);
    }
    catch (TimeoutException exception)
    {
        Log(exception.Message);
        // Abort WCF factory
    }
    catch (CommunicationException exception)
    {
        Log(exception.Message);
        // Abort WCF factory
    } 

    return returnUser;
}

リポジトリに設定したすべてのメソッドで、この同じ try-catch ブロックを使用したくありません。このようなことをやってみましたが、パラメーターでエラーが発生しました。私はそれらを正しく使用していないことを知っていますが、作成したいすべての WCF メソッド呼び出しを代用できるデリゲートを定義する方法が必要です。

delegate object WCFAction(params object[] parameters);

object DoWCFAction(WCFAction action, params object[] parameters)
{
    object returnValue = null;

    try
    {
        // Open WCF channel, etc.
        returnValue = action(parameters);
    }
    catch (TimeoutException exception)
    {
        Log(exception.Message);
        // Abort WCF factory
    }
    catch (CommunicationException exception)
    {
        Log(exception.Message);
        // Abort WCF factory
    } 

    return returnValue;
}

void MainMethod()
{
    // Compiler error
    User user = DoWCFAction(GetUser, 1);
}
4

2 に答える 2

1

このようなクラスを設定できます。申し訳ありませんが、ここには 1 つではなく 2 つの例外ハンドラーがあります。

class Logger
{
    // handle wcf calls that return void
    static public void ExecWithLog(Action action)
    {
        try
        {
            action();
        }
        catch(Exception e)
        {
            Log(e);
            throw;
        }
    }

    // handle wcf calls that return a value
    static public T ExecWithLog<T>(Func<T> action)
    {
        T result = default(T);
        try
        {
            result = action();
        }
        catch (Exception e)
        {
            Log(e);
            throw;
        }

        return result;
    }

    static void Log(Exception e)
    {
        System.Diagnostics.Debug.WriteLine(e.ToString());
    }

}

次に、メソッドを呼び出すには:

static void Main(string[] args)
{
    Logger.ExecWithLog(() => DoSomethingReturnVoid());
    Logger.ExecWithLog(() => DoSomethingReturnVoidParamInt(5));
    int a = Logger.ExecWithLog<int>(() => DoSomethingReturnInt());
    string b = Logger.ExecWithLog<string>(() => DoSomethingReturnStringParamInt(5));
}
于 2013-02-18T21:11:28.230 に答える