【发布时间】:2018-04-12 03:53:03
【问题描述】:
我正在客户端实现 WCF 服务的重试逻辑。 我在 WCF 服务中有多个操作,具有各种输入参数和返回类型。
我创建了一个包装器,它可以使用 Action 委托调用这些没有返回类型(void)的特定方法。有没有办法调用具有各种输入参数和返回类型的方法。
或者是否有任何逻辑可以在可以处理多个 WCF 服务的客户端实现重试功能。
Class RetryPolicy<T>
{
public T ExecuteAction(Func<T> funcdelegate,int? pretrycount = null,bool? pexponenialbackoff = null)
{
try
{
var T = funcdelegate();
return T;
}
catch(Exception e)
{
if (enableRetryPolicy=="ON" && TransientExceptions.IsTransient(e))
{
int? rcount = pretrycount == null ? retrycount : pretrycount;
bool? exbackoff = pexponenialbackoff == null ? exponentialbackoff : pexponenialbackoff;
int rt = 0;
for (rt = 0; rt < rcount; rt++)
{
if (exponentialbackoff)
{
delayinms = getWaitTimeExp(rt);
}
System.Threading.Thread.Sleep(delayinms);
try
{
var T = funcdelegate();
return T;
}
catch(Exception ex)
{
if (TransientExceptions.IsTransient(ex))
{
int? rcount1 = pretrycount == null ? retrycount : pretrycount;
bool? exbackoff1 = pexponenialbackoff == null ? exponentialbackoff : pexponenialbackoff;
}
else
{
throw;
}
}
}
//throw exception back to caller if exceeded number of retries
if(rt == rcount)
{
throw;
}
}
else
{
throw;
}
}
return default(T);
}
}
我使用上述方法拨打电话
public string GetCancelNumber(string property, Guid uid)
{
RetryPolicy<string> rp = new RetryPolicy<string>();
return rp.ExecuteAction(()=>Channel.GetCancelNumber(property, uid, out datasetarray));
}
我不断收到错误“无法在匿名委托中使用 ref 或 out 参数”
【问题讨论】:
-
我不确定我是否清楚地理解了你的问题。但是对于返回类型委托,您可以使用Func
-
Func 委托需要某些输入参数..但在运行时我不确定它们..
-
哦,所以您正在寻找一种方法来实现对每个方法的重试,而无需手动编写方法定义?
-
是的,有什么办法可以做到。
-
我不能对每个方法都重试,但是我可以写一些包装器来调用这些方法。
标签: c# .net wcf-4 retrypolicy wcf-data-services-client