1

我想使用Polly不是检查明显的“失败”,而是检查其他情况。具体来说,我想进行一次(异步)调用,例如httpClient.GetAsync(...),出于这个问题的目的,我知道它会成功 - 也就是说,在执行以下操作之后:

var response = await _myHttpRequestPolicy.ExecuteAsync(() => httpClient.GetAsync(uri));

response.IsSuccessStatusCodetrue

让我们假设然后我做标准:

var content = await response.Content.ReadAsStringAsync();

content == { "Name":"Tom", "Age", 30", "ErrorCode":"12345" }

ErrorCode我希望我的策略逻辑根据响应部分的内容(或不存在或存在)来执行。所以这只是我打的一个电话。

我怎样才能用波莉做到这一点?

4

1 回答 1

0

您正在配置一个策略来保护 HttpClient GetAsync 方法,该方法返回Task<HttpResponseMessage>. 您想Policy<HttpResponseMessage>使用异步处理程序配置 a 以使用此方法。

Policy<T>.HandleResult(Func<T, bool> filter)允许您查看 HttpResponseMessage 并确定是否要处理该结果。

几个选项。一,您可以在 HandleResult 方法中找出反序列化/读取 HttpResponseMessage 的 json 有效负载。你只能得到一个Func<HttpResponseMessage, bool>工作。这需要同步发生,因为添加 async/await 会将返回类型更改为 Task。

其次,您可以在更高级别应用该策略。像 httpclient.GetAsync(uri) 一样获取响应,然后反序列化内容。也许有一个Policy<HttpResponseMessage>包装 httpclient 调用,一个Policy<MyAbstractApiResponse>在反序列化后查找自定义错误代码?

请注意,API 错误应该由 HttpResponseMessage 上的 IsSuccessStatusCode 属性真正获取。您的 REST api(是您的吗?这是一个假设)应该设置适合错误的状态代码,而不仅仅是 200 和自定义响应属性。

相关进一步阅读:在使用 Polly 重试之前检查响应的字符串内容

更新:

class Consumer
{
  public void Test()
  {
    var apiResponse = Policy<IApiResponse>
      .HandleResult(resp => !string.IsNullOrWhiteSpace(resp.ErrorCode))
      // Setup Policy
      .ExecuteAsync(() => otherClassInstance.MakeApiCall());
  }
}

class OtherClass
{
  HttpClient httpClient = ...;
  public async Task<IApiResponse> MakeApiCall()
  {
    var response = Policy<HttpResponseMessage>
      .HandleResult(message => !message.IsSuccessStatusCode)
      // Setup Policy
      .ExecuteAsync(() => httpClient.GetAsync(url));

    var content = await response.ReadAsStringAsync();
    return new ApiResponse(content);
  }
}

我没有查看真正的方法名称或语法将它们放在一起,因此它可能无法编译。希望您能理解我试图传达的想法,一项政策是从另一项政策中调用的。

于 2018-08-06T17:08:39.760 回答