猿问

无法从托管服务中的缓存附加身份验证令牌

我是 .net 的新手,我真的很想了解应用程序的这种行为。我有一个名为的函数GetOrg(),它基本上请求 API 端点并获取数据,以获取我需要在每个请求中传递身份验证令牌的数据。为了获取身份验证令牌,我有另一个函数调用来GetAccessToken获取令牌并将其保存在缓存中。我创建了一个名称httpclient,它将令牌附加到 NonProductionEnv客户端的每个请求。

现在的问题是,当我GetOrg()在托管服务中设置时,如下所示,它不会附加令牌并请求没有身份验证令牌的 API 端点,但如果我GetOrg()在控制器中设置,它就可以正常工作。

启动时指定的客户端:


    services.AddHttpClient("NonProductionEnv", client =>

{

    client.BaseAddress = new Uri(Configuration["NonProductionEnvironment:NP_API_URL"]);

    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", (String)_cache.Get("np"));

});

下面的日志每秒生成一次,因为我需要每秒调用 api 端点。

现在正在侦听:https://localhost:5001现在正在侦听: http://localhost:5000应用程序已启动。按 Ctrl+C 关闭。信息:System.Net.Http.HttpClient.NonProductionEnv.LogicalHandler[100] 开始处理 HTTP 请求 GET https://api.sample.io/v3/organizations信息:System.Net.Http.HttpClient.NonProductionEnv.ClientHandler[100]发送 HTTP 请求 GET https://api.sample.io/v3/organizations信息:System.Net.Http.HttpClient.NonProductionEnv.ClientHandler[101] 在 53.3973ms 后收到 HTTP 响应 - 未经授权

PS:我不太了解.net 及其工作原理。


大话西游666
浏览 83回答 1
1回答

森林海

您正在使用应用程序启动时HttpClient从缓存中检索的静态值进行注册。此时,您的托管服务尚未运行,因此缓存中还没有任何价值。一旦缓存中最终有一个值,标头早已被设置,并且您永远不会重置它。这里实际上完全不需要缓存。您也不需要Authorization在实际的客户端注册中设置标头。相反,只需将您的GetAccessToken方法修改为:private void GetAccessToken(object state){&nbsp; &nbsp; Dictionary<string, string> authenticationCredentials_np = Configuration.GetSection("NonProductionEnvironment:Credentials").GetChildren().Select(x => new KeyValuePair<string, string>(x.Key, x.Value)).ToDictionary(x => x.Key, x => x.Value);&nbsp; &nbsp; Token token_np = GetToken(new Uri(Configuration["NonProductionEnvironment:URL"]), authenticationCredentials_np).Result;&nbsp; &nbsp; _client_NP.DefaultRequestHeaders.Add("Authorization", $"Bearer {token_np.AccessToken}");}
随时随地看视频慕课网APP
我要回答