HttpClient 发送授权承载为空

时间:2021-06-30 20:02:24

标签: c# httpclient webapi

在 Startup 类中,我使用 AddHttpClient 方法获取 jwt 令牌(使用 MSAL)并将其分配给 DefaultRequestHeaders.Authorization:

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", response.AccessToken);

我已经将 accessToken 与 Postman 一起使用,当我稍后在 5 月代码中使用它时它是有效的。

在调用 API 的代码中,我使用 IHttpClientFactory 解析了一个 HttpClient:

var httpClient = _httpClientFactory.CreateClient("client");

HttpClient details

并尝试调用我的 API。调用失败并显示 401 并查看 HttpRequestMessage,我看到 Authorization Header 存在但参数为空:

RequestMessage details

如果我构造了第二个 HttpClient 并从使用 IHttpClientFactory 构造的那个分配了 Authorization 标头,则调用就像一个魅力:

var httpClient2 = new HttpClient();
httpClient2.DefaultRequestHeaders.Authorization = httpClient.DefaultRequestHeaders.Authorization;

// This call fails
var response = await httpClient.GetAsync("Game/All", cancellationToken);
// This call succeed
response = await httpClient2.GetAsync("Game/All", cancellationToken);

我的代码有什么问题? IHttpClientFactory 提供的 HttpClient 没有明显相同的行为,但为什么呢?

1 个答案:

答案 0 :(得分:0)

好的,我发现了问题,这是由于我过去的。

稍后在我的代码中,我使用 HttpClient 注册了相同的 HttpMessageHandler(同名),该 HttpClient 负责在每次调用之前使用令牌填充 Authorization 标头。

由于工作未完成,处理程序用空字符串填充标题。

执行了两个 {{1}} 配置,这是最后一个得到最后一句话的...