C# WCF服务重试
我试图弄清楚,当服务发送错误时,是否有一种简单的方法来实现重试。比如说:C# WCF服务重试,c#,vb.net,wcf,C#,Vb.net,Wcf,我试图弄清楚,当服务发送错误时,是否有一种简单的方法来实现重试。比如说: Private Function SaveEmployee(emp as Empoyee) Try ... returnval = service.SaveEmployee(emp) Catch ex as exception 'if exception requires retry eg:end point not found or database is not responding then 'call retry
Private Function SaveEmployee(emp as Empoyee)
Try
...
returnval = service.SaveEmployee(emp)
Catch ex as exception
'if exception requires retry eg:end point not found or database is not responding then
'call retry func/class
RetryOperation(...)
End Try
End Function
在上面的示例中,我如何创建一个通用的RetryOperation类,它可以接受任何函数,并在通知用户操作无法完成之前每隔3到4次调用它
我希望有可能生成一个通用方法,而不是在所有服务调用函数中都有重复的代码
C#或vb.net中的任何示例都将非常感谢
谢谢如果这是一个呼叫,如果失败,您可能希望重复,为什么不立即使用重复功能,如果服务呼叫成功,它将只被调用一次,如果服务呼叫失败,它将重试x次,如果它在第x次失败,它将抛出异常 类似这样的情况如何?请注意,这大大简化了,您需要添加错误处理等: 创建重复方法,如下所示:
private void RepeatCall(int numberOfCalls, Action unitOfWork)
{
for (int i = 1; i <= numberOfCalls; i++)
{
try
{
unitOfWork();
}
catch (...)
{
// decide which exceptions/faults should be retried and
// which should be thrown
// and always throw when i == numberOfCalls
}
}
}
在VB.NET中也是这样
Private Sub RepeatCall(ByVal numberOfCalls As Integer, ByVal unitOfWork As Action)
For i = 1 To numberOfCalls
Try
unitOfWork()
Catch ex As Exception
End Try
Next
End Sub
使用它:
Try
RepeatCall(3, Sub()
MyServiceCall()
End Sub)
Catch ex As Exception
End Try
如果这是一个调用,如果失败,您可能希望重复,为什么不立即使用重复功能,如果服务调用成功,它将只被调用一次,如果服务调用失败,它将重试x次,如果它在第x次失败,它将抛出一个异常 类似这样的情况如何?请注意,这大大简化了,您需要添加错误处理等: 创建重复方法,如下所示:
private void RepeatCall(int numberOfCalls, Action unitOfWork)
{
for (int i = 1; i <= numberOfCalls; i++)
{
try
{
unitOfWork();
}
catch (...)
{
// decide which exceptions/faults should be retried and
// which should be thrown
// and always throw when i == numberOfCalls
}
}
}
在VB.NET中也是这样
Private Sub RepeatCall(ByVal numberOfCalls As Integer, ByVal unitOfWork As Action)
For i = 1 To numberOfCalls
Try
unitOfWork()
Catch ex As Exception
End Try
Next
End Sub
使用它:
Try
RepeatCall(3, Sub()
MyServiceCall()
End Sub)
Catch ex As Exception
End Try
感谢您的回复,我有点困惑,您是否建议dafult调用RepeatCall,然后它发送异常?。我想要的是客户机函数将调用服务函数,如果它抛出异常,则只应调用RepeatCall。还是我完全误解了你的建议?我更新了我的答案见上文,使用我的代码示例,没有任何东西阻止你做你在问题中描述的事情,我刚刚描述了我使用的一种方法。通过这种方式,您可以将重试逻辑放在RepeatCall方法中,而不是为每个服务调用复制它。再次感谢,这确实有意义,并且消除了重新编写catch-throw-in方法。只是想知道RepeatCall是否可以在自己的线程上运行?您有什么建议吗?当然,这取决于您的需求,也就是说,您的代码是否需要了解servicecall是如何进行的?在这种情况下,您需要某种类型的同步。我想我会将线程放在RepeatCall方法中,并添加一些回调类型,以便主线程可以获得操作的最终结果(成功或失败)。感谢您的回复,我有点困惑,您是否建议dafult调用RepeatCall,然后它发送异常?。我想要的是客户机函数将调用服务函数,如果它抛出异常,则只应调用RepeatCall。还是我完全误解了你的建议?我更新了我的答案见上文,使用我的代码示例,没有任何东西阻止你做你在问题中描述的事情,我刚刚描述了我使用的一种方法。通过这种方式,您可以将重试逻辑放在RepeatCall方法中,而不是为每个服务调用复制它。再次感谢,这确实有意义,并且消除了重新编写catch-throw-in方法。只是想知道RepeatCall是否可以在自己的线程上运行?您有什么建议吗?当然,这取决于您的需求,也就是说,您的代码是否需要了解servicecall是如何进行的?在这种情况下,您需要某种类型的同步。我想我会将线程放在RepeatCall方法中,并添加一些回调类型,以便主线程可以获得操作的最终结果(成功或失败)