拦截 C# HttpClient GetAsync
Intercept C# HttpClient GetAsync
我有一个 Web 项目(C#、MVC5 但没有 WebAPI)和一个简单的 HTTP REST 客户端,它调用外部 REST 服务并获取 accessToken 等。
我想检查所有 Get/PostAsync 调用对 statusCode 401 的响应,但我发现在实现 DelegatingHandler
.[=14 时我只能覆盖 SendAsync
方法=]
class CustomDelegatingHandler : DelegatingHandler
{
async protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
if (response.StatusCode == HttpStatusCode.Unauthorized)
{
还有什么我可以做的,以免更改我所有异步调用的实现以使用 SendAsync
?
(我真正想做的是刷新accessToken。)
使用 Decorator 或 Interceptor 模式。
具体装饰器示例:
public class CustomDelegatingHandlerTokenRefresher() : DelegatingHandler
{
public CustomDelegatingHandlerTokenRefresher(DelegatingHandler handler)
{
InnerHandler = handler;
}
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
RefreshToken();
return await InnerHandler.SendAsync(request, cancellationToken);
}
}
我认为您的方向是正确的。不过,您无需将调用更改为使用 SendAsync
而不是 GetAsync
、PostAsync
等。相反,您需要更改实例化方式 HttpClient
:
var client = new HttpClient(new CustomDelegatingHandlerTokenRefresher());
// GetAsync, PostAsync, etc will hit your handler
我有一个 Web 项目(C#、MVC5 但没有 WebAPI)和一个简单的 HTTP REST 客户端,它调用外部 REST 服务并获取 accessToken 等。
我想检查所有 Get/PostAsync 调用对 statusCode 401 的响应,但我发现在实现 DelegatingHandler
.[=14 时我只能覆盖 SendAsync
方法=]
class CustomDelegatingHandler : DelegatingHandler
{
async protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
HttpResponseMessage response = await base.SendAsync(request, cancellationToken);
if (response.StatusCode == HttpStatusCode.Unauthorized)
{
还有什么我可以做的,以免更改我所有异步调用的实现以使用 SendAsync
?
(我真正想做的是刷新accessToken。)
使用 Decorator 或 Interceptor 模式。
具体装饰器示例:
public class CustomDelegatingHandlerTokenRefresher() : DelegatingHandler
{
public CustomDelegatingHandlerTokenRefresher(DelegatingHandler handler)
{
InnerHandler = handler;
}
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
RefreshToken();
return await InnerHandler.SendAsync(request, cancellationToken);
}
}
我认为您的方向是正确的。不过,您无需将调用更改为使用 SendAsync
而不是 GetAsync
、PostAsync
等。相反,您需要更改实例化方式 HttpClient
:
var client = new HttpClient(new CustomDelegatingHandlerTokenRefresher());
// GetAsync, PostAsync, etc will hit your handler