您正在配置一个策略来保护 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);
}
}
我没有查看真正的方法名称或语法将它们放在一起,因此它可能无法编译。希望您能理解我试图传达的想法,一项政策是从另一项政策中调用的。