![](/img/trans.png)
[英]“Cannot redirect after HTTP headers have been sent.” When returning HttpResponseMessage with HttpStatusCode.Unauthorized
[英]Using Polly to retry after HttpStatusCode.Unauthorized
我正在调用外部 API 并希望处理调用返回Unauthorized
HttpResponseMessage
的事件。 发生这种情况时,我想刷新访问令牌并再次拨打电话。
我正在尝试将Polly
与以下代码一起使用:
public async Task<HttpResponseMessage> MakeGetRequestAsync()
{
var retryPolicy = Policy
.HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.Unauthorized)
.Retry(1, (exception, retryCount) =>
{
RefreshAccessToken();
});
var result = await retryPolicy.ExecuteAsync(() => CallApiAsync());
return result;
}
private async Task<HttpResponseMessage> CallApiAsync()
{
var url = Options.ResourceSandboxUrl;
var httpClient = new HttpClient();
SetRequestHeaders(httpClient);
var response = await httpClient.GetAsync(url);
response.StatusCode = HttpStatusCode.Unauthorized;
return response;
}
我在
ExecuteAsync
语句和DoSomethingAsync
中设置断点 - 当我跨过ExecuteAsync
时,不会调用DoSomethingAsync
并将控制权返回给调用 MakeGetRequestAsync 的MakeGetRequestAsync
我不明白为什么不调用DoSomethingAsync
- 任何人都可以帮助我实现我想要实现的目标吗?
我查看了有关 Stack Overflow 的 Polly 文档和 Polly 问题,但我不知道发生了什么......
我正在回答这个老问题只是为了指出官方记录此模式的 Polly wiki 页面:
特别是这是建议的代码片段:
var authorisationEnsuringPolicy = Policy
.HandleResult<HttpResponseMessage>(r => r.StatusCode == HttpStatusCode.Unauthorized)
.RetryAsync(
retryCount: 1, // Consider how many retries. If auth lapses and you have valid credentials, one should be enough; too many tries can cause some auth systems to blacklist.
onRetryAsync: async (outcome, retryNumber, context) => FooRefreshAuthorizationAsync(context),
/* more configuration */);
var response = authorisationEnsuringPolicy.ExecuteAsync(context => DoSomethingThatRequiresAuthorization(context), cancellationToken);
FooRefreshAuthorizationAsync(...)
方法可以获取新的授权令牌并将其传递给使用Polly.Context
通过策略执行的委托。
这就是 async await 在 .net 中的工作方式,当您的代码执行达到await
,会发生两件事
您的代码的当前线程应该释放以使您的代码异步,这意味着您的方法应该返回
当您等待的任务完成时,您的方法应该从以前的位置继续
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.