You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在ASP.NET Core MVC与Azure中优化API请求头的高效实现

问题:ASP.NET Core 8.0 MVC中高效配置API请求头的方法

我使用ASP.NET Core 8.0 MVC开发了一个Web应用,我们的API仅接受带有正确scope和clientID的请求。目前调用API时遇到访问问题,仅能通过创建服务调用Get/Put/Post接口,且需在每次请求中手动添加请求头。现咨询是否存在更高效的请求头创建方式?能否在program.cs文件中配置实现?

当前调用代码

每次调用需手动提取令牌并添加至HttpClient请求头:

using var request = await _downstreamApi.CallApiForUserAsync("DownstreamApi");
var BearerToken = request.RequestMessage.Headers.Authorization;

// 将令牌添加到HttpClient请求头
_httpClient.DefaultRequestHeaders.Authorization = BearerToken;

后续API调用逻辑:

var response = await _httpClient.GetAsync("api/AccountCategoryType");
response.EnsureSuccessStatusCode();

return await response.Content.ReadFromJsonAsync<IEnumerable<AccountCategoryType>>();

现有program.cs配置

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
        .EnableTokenAcquisitionToCallDownstreamApi(initialScopes)
            .AddMicrosoftGraph(builder.Configuration.GetSection("MicrosoftGraph"))
            .AddDownstreamApi("DownstreamApi", builder.Configuration.GetSection("DownstreamApi"))
            .AddInMemoryTokenCaches();

解决方案

方法1:直接使用IDownstreamApi内置方法调用API

IDownstreamApi已封装令牌自动获取与请求头附加逻辑,无需手动处理。直接调用对应方法即可完成API请求:

var result = await _downstreamApi.CallApiForUserAsync<IEnumerable<AccountCategoryType>>(
    "DownstreamApi",
    options =>
    {
        options.RelativePath = "api/AccountCategoryType";
        options.HttpMethod = HttpMethod.Get;
    });

return result;

POST/PUT请求只需修改HttpMethod并传入请求内容即可,全程无需手动操作请求头。

方法2:配置自动附加令牌的HttpClient

若偏好使用自定义HttpClient实例,可通过消息处理器实现令牌自动注入,在program.cs中完成配置:

// 注册带令牌自动注入的HttpClient
builder.Services.AddHttpClient("MyApiClient")
    .AddHttpMessageHandler<BearerTokenHandler>();

// 自定义消息处理器:自动获取并添加Authorization头
public class BearerTokenHandler : DelegatingHandler
{
    private readonly ITokenAcquisition _tokenAcquisition;
    private readonly IConfiguration _configuration;

    public BearerTokenHandler(ITokenAcquisition tokenAcquisition, IConfiguration configuration)
    {
        _tokenAcquisition = tokenAcquisition;
        _configuration = configuration;
    }

    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
    {
        var scopes = _configuration.GetSection("DownstreamApi:Scopes").Get<string[]>();
        var token = await _tokenAcquisition.GetAccessTokenForUserAsync(scopes);
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);

        return await base.SendAsync(request, cancellationToken);
    }
}

// 注册自定义处理器
builder.Services.AddTransient<BearerTokenHandler>();

在服务中通过IHttpClientFactory获取配置好的HttpClient即可自动带令牌请求:

private readonly IHttpClientFactory _httpClientFactory;

public YourService(IHttpClientFactory httpClientFactory)
{
    _httpClientFactory = httpClientFactory;
}

public async Task<IEnumerable<AccountCategoryType>> GetAccountCategoryTypes()
{
    var client = _httpClientFactory.CreateClient("MyApiClient");
    var response = await client.GetAsync("api/AccountCategoryType");
    response.EnsureSuccessStatusCode();

    return await response.Content.ReadFromJsonAsync<IEnumerable<AccountCategoryType>>();
}

方法3:复用AddDownstreamApi配置的HttpClient

你已通过AddDownstreamApi完成了API的scope与客户端信息配置,对应的HttpClient已自动集成令牌处理逻辑。直接通过IHttpClientFactory获取该客户端即可:

private readonly IHttpClientFactory _httpClientFactory;

public YourService(IHttpClientFactory httpClientFactory)
{
    _httpClientFactory = httpClientFactory;
}

public async Task<IEnumerable<AccountCategoryType>> GetAccountCategoryTypes()
{
    var client = _httpClientFactory.CreateClient("DownstreamApi");
    var response = await client.GetAsync("api/AccountCategoryType");
    response.EnsureSuccessStatusCode();

    return await response.Content.ReadFromJsonAsync<IEnumerable<AccountCategoryType>>();
}

此方法无需额外配置,直接复用现有注册的客户端即可实现自动附加请求头。


内容的提问来源于stack exchange,提问作者Manny Sanchez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 10:13:17