在Blazor项目中添加Refit NuGet包
在Startup.cs文件中,添加以下代码:
using System.Net.Http;
using Refit;
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddScoped();
services.AddRefitClient()
.ConfigureHttpClient(c =>
{
c.BaseAddress = new Uri("https://example.com");
})
.AddHttpMessageHandler();
}
public void Configure(IApplicationBuilder app)
{
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
public interface IMyApi
{
[Get("/api/users")]
Task> GetUsers();
}
public class User
{
public int Id { get; set; }
public string Name { get; set; }
}
public class BearerTokenHandler : DelegatingHandler
{
private readonly IAccessTokenProvider _accessTokenProvider;
public BearerTokenHandler(IAccessTokenProvider accessTokenProvider)
{
_accessTokenProvider = accessTokenProvider;
}
protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var token = await _accessTokenProvider.RequestAccessToken();
if (!string.IsNullOrWhiteSpace(token))
{
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
}
return await base.SendAsync(request, cancellationToken);
}
}
public interface IAccessTokenProvider
{
Task RequestAccessToken();
}
public class IdentityServerAccessTokenProvider : IAccessTokenProvider
{
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly IHttpClientFactory _httpClientFactory;
public IdentityServerAccessTokenProvider(IHttpContextAccessor httpContextAccessor, IHttpClientFactory httpClientFactory)
{
_httpContextAccessor = httpContextAccessor;
_httpClientFactory = httpClientFactory;
}
public async Task RequestAccessToken()
{
var accessToken = await _httpContextAccessor.HttpContext.GetTokenAsync("access_token");
if (string.IsNullOrWhiteSpace(accessToken))
{
var client = _httpClientFactory.CreateClient("IdentityServer");
var disco = await client.GetDiscoveryDocumentAsync("https://example.com");
if (disco.IsError)
{
throw new Exception(disco.Error);
}
var tokenClient = _httpClientFactory.CreateClient("IdentityServer");
var tokenResponse = await tokenClient.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest
{
Address = disco.TokenEndpoint,
ClientId = "your_client_id",