【发布时间】:2021-07-02 02:13:18
【问题描述】:
在 Startup 类中,我使用 AddHttpClient 方法获取 jwt 令牌(使用 MSAL)并将其分配给 DefaultRequestHeaders.Authorization:
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", response.AccessToken);
我已经在 Postman 中使用了 accessToken,当我稍后在可能的代码中使用它时它是有效的。
在调用 API 的代码中,我使用 IHttpClientFactory 解析了一个 HttpClient:
var httpClient = _httpClientFactory.CreateClient("client");
并尝试调用我的 API。调用失败并显示 401 并查看 HttpRequestMessage,我看到 Authorization Header 存在但参数为空:
如果我构造第二个 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 显然没有相同的行为,但是为什么呢?
【问题讨论】:
-
请edit您的问题显示您“获取 jwt 令牌并将其分配给 DefaultRequestHeaders.Authorization”的代码。
-
如果您添加一个“授权”的通用标题而不是使用
.Authorization属性,它是否有效? -
@Crowcoder 行为相同,令牌被识别为授权标头。第一个 httpClient 调用失败,从第一个 httpClient 中提取的标头成功......这太疯狂了
-
图片展示了与您讲述的不同的故事。第一个客户端没问题,但是第二个是empy 能发一下启动吗?
-
@Serge 不,第一张图片显示了第一个 HttpClient 的 DefaultRequestHeader,第二张图片是使用相同 HttpClient 完成的调用响应的 HttpRequestMessage 详细信息。与第二个 HttpClient 的调用成功,并且 HttpRequestMessage 中的 Authorization 标头已正确填充。
标签: c# httpclient webapi