gpt4 book ai didi

c# - 在 Servicestack JsonServiceClient Get 方法上实现重试的最佳解决方案是什么?

转载 作者:行者123 更新时间:2023-11-30 16:08:30 28 4
gpt4 key购买 nike

在我的项目中,我使用 Servicestack 从特定的 URL 获取数据,这个过程是可配置的,我在单独的线程中调用获取数据,如果出现超时错误,我想实现重试。我在 JsonServiceClient 上创建了包装器类并在那里实现重试,但我想知道这种方法的最佳解决方案是什么。

var _client = new JsonServiceClient { Timeout = timeout };
var counter = 0;
do
{
try
{
result = _client.Get<TResponse>(url);
break;
}
catch (Exception exp)
{
//Logging exception
}
}
while (++counter < this.Retry);

最佳答案

I created wrapper class on JsonServiceClient and implement retry there, but I want to know what's the best solution for this approach.

我同意你的做法。扩展 JsonServiceClient并实现您的重试逻辑,如果您已经实现了如下内容,那么这是实现可重用性和可维护性的最佳方法。

扩展JsonServiceClient

扩展JsonServiceClient因此您可以合并自己的重试逻辑。然后无需使用 while 即可轻松在您的代码中重用它并在每次您想发出请求时进行反击。

如果您看到 JsonServiceClientBase.cs 代码在这里,你会注意到所有的动词方法,如Get<TResponse> Post<TResponse> ... Put等都通过Send<TResponse>(object request)来电方法。

因此通过重写这个方法,我们可以很容易地在所有动词上实现重试功能,而无需改变它的用法。

public class MyJsonServiceClientWithRetry : JsonServiceClient
{

public MyJsonServiceClientWithRetry()
{
}

public MyJsonServiceClientWithRetry(int retryAttempts)
{
RetryAttempts = retryAttempts;
}

public MyJsonServiceClientWithRetry(string baseUri) : base(baseUri)
{
}

public MyJsonServiceClientWithRetry(string syncReplyBaseUri, string asyncOneWayBaseUri) : base(syncReplyBaseUri, asyncOneWayBaseUri)
{
}


// Retry attempts property
public int RetryAttempts { get; set; }


public override TResponse Send<TResponse> (string httpMethod, string relativeOrAbsoluteUrl, object request)
{
int attempts = RetryAttempts;

while(true)
{
attempts--;

try {
return base.Send<TResponse> (httpMethod, relativeOrAbsoluteUrl, request);
} catch (WebServiceException webException) {

// Throw the exception if the number of retries is 0 or we have made a bad request, or are unauthenticated
if(attempts == 0 || webException.StatusCode == 400 || webException.StatusCode == 401)
throw;

} catch (Exception exception) {

// Throw the exception if the number of retries is 0
if(attempts == 0)
throw;
}
}
}
}

用法:

  • 替换对 JsonServiceClient 的引用与 MyJsonServiceClientWithRetry
  • 设置尝试次数
  • 正常使用客户端。 (包装在 try/catch block 中以在超过重试后捕获异常)
var client = new MyJsonServiceClientWithRetry ("http://localhost:8080") {
RetryAttempts = 3,
Timeout = new TimeSpan(0, 0, 30)
};


try
{
var myRequestDto = new MyRequest {
Name = "John Smith"
};

// This request will be attempted 3 times (if there is an exception)
var response = client.Get<MyResponse>(myRequestDto);

// Do something with response ...

} catch(Exception ex) {
// Exception thrown here after 3 attempts (or immediately if status code is 400 / 401)
}

注意事项:

如果 WebServiceException 我不会重试抛出状态代码 400 或 401,因为在不更改它的情况下再次尝试此请求似乎是多余的。显然,您可以自定义此逻辑。

如果连接超时,则超时错误将作为 WebException 抛出。 .如果您想专门处理这种情况。

希望对您有所帮助。

关于c# - 在 Servicestack JsonServiceClient Get 方法上实现重试的最佳解决方案是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29113836/

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