拦截 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。)

使用 DecoratorInterceptor 模式。

具体装饰器示例:

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 而不是 GetAsyncPostAsync 等。相反,您需要更改实例化方式 HttpClient:

var client = new HttpClient(new CustomDelegatingHandlerTokenRefresher());
// GetAsync, PostAsync, etc will hit your handler