gpt4 book ai didi

wcf - 如何将每个 WCF 调用包装在 try-catch block 中

转载 作者:行者123 更新时间:2023-12-04 22:38:35 26 4
gpt4 key购买 nike

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

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

我想这样调用它:

// 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 block 。我尝试做这样的事情,但它给了我一个关于参数的错误。我知道我没有正确使用它们,但我需要一种方法来定义一个可以委托(delegate)我想要进行的所有 WCF 方法调用的委托(delegate):

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

最佳答案

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

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

关于wcf - 如何将每个 WCF 调用包装在 try-catch block 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14906373/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com