webclient token自动刷新
时间: 2025-02-24 22:27:37 浏览: 43
### WebClient 中实现 Token 自动刷新
为了确保 HTTP 请求能够持续获得有效的认证,在使用 `WebClient` 进行网络通信时,可以设计一种机制来处理 token 的过期问题并自动刷新它。这通常涉及到拦截器模式或扩展方法的设计。
当遇到未授权状态(通常是 401 响应码)时,应用程序应该尝试获取新的 access_token 并重试原始请求[^2]。下面是一个基于此逻辑构建的 C# 示例代码片段:
```csharp
public class AuthenticatedWebClient : WebClient
{
private string _accessToken;
private readonly object _lockObject = new();
protected override WebRequest GetWebRequest(Uri address)
{
var request = base.GetWebRequest(address);
lock (_lockObject)
{
// 添加 Bearer Token 到头部
if (!string.IsNullOrEmpty(_accessToken))
((HttpWebRequest)request).Headers["Authorization"] = "Bearer " + _accessToken;
}
return request;
}
public async Task<T> DownloadDataWithTokenRefreshAsync<T>(Uri uri, Func<WebClient, Uri, T> downloadFunction)
{
try
{
return await Task.Run(() => downloadFunction(this, uri));
}
catch (WebException ex) when (((HttpWebResponse)ex.Response)?.StatusCode == HttpStatusCode.Unauthorized)
{
// 尝试刷新令牌
RefreshAccessToken();
// 使用新令牌重新执行请求
return await Task.Run(() => downloadFunction(this, uri));
}
}
private void RefreshAccessToken()
{
// 实际应用中这里应该是调用API接口去换取最新的access_token
Console.WriteLine("Refreshing Access Token...");
_accessToken = Guid.NewGuid().ToString(); // 模拟一个新的token
// 更新后的token应当被安全存储起来以便后续使用
}
}
```
上述代码展示了如何创建一个继承自 `WebClient` 的类,并在其内部实现了简单的 token 刷新功能。每当发生未经授权错误时,程序会先尝试更新 `_accessToken` 属性中的值再重复之前的请求过程[^3]。
请注意实际开发环境中还需要考虑更多因素如并发控制、异常情况下的回退策略以及安全性等问题。
阅读全文
相关推荐


















