如何在try-catch块中包装每个WCF调用

时间:2013-02-16 02:42:21

标签: wcf delegates try-catch

我有一个网站,我需要对WCF服务进行异步调用。 我想在try-catch块中包装每个调用,以便我可以处理TimeoutExceptions和CommunicationExceptions。

但是,每次调用我的服务时,我都不想复制粘贴完全相同的try-catch块。有没有什么方法可以使用委托只写一次try-catch块?我还想捕获异常消息。

我想称之为:

// 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);
}

2 个答案:

答案 0 :(得分:1)

您可以设置这样的课程。抱歉,这里有两个异常处理程序,而不是一个:

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));
}

答案 1 :(得分:1)

使用WCF进行此操作的正确方法是使用扩展。看一下WCF Extensions上的这些文章: