【发布时间】:2016-10-22 01:32:57
【问题描述】:
鉴于 .net HttpClient 在设计时考虑了重用性,并且在短期实例中旨在成为 long lived 和 memory leaks have been reported。在为多个用户调用端点时,您希望使用不同的承载令牌(或任何授权标头)对给定端点进行安静的调用,有哪些指导方针?
private void CallEndpoint(string resourceId, string bearerToken) {
httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("bearer", bearerToken);
var response = await httpClient.GetAsync($"resource/{resourceid}");
}
鉴于上述代码可以被 Web 应用程序上的任意数量的线程调用,很可能第一行中设置的标头与调用资源时使用的标头不同。
在不使用锁和维护无状态 Web 应用程序的情况下,为单个端点创建和处理 HttpClients 的推荐方法是什么(我目前的做法是为每个端点创建一个客户端)?
生命周期
虽然 HttpClient 确实间接实现了 IDisposable 接口,HttpClient的推荐用法是不要dispose 在每个请求之后。 HttpClient 对象旨在为 只要您的应用程序需要发出 HTTP 请求。有一个对象 存在于多个请求中启用设置的地方 DefaultRequestHeaders 并防止您必须重新指定内容 就像每个请求上的 CredentialCache 和 CookieContainer 一样 HttpWebRequest 是必需的。
【问题讨论】:
-
您是在谈论相对较少的不同身份验证标头或批次,例如每个用户都是唯一的吗?
-
@ToddMenier - 这将是每个用户的唯一标题。这将是用户 oauth 令牌。我认为 scott hannen 让我走上了正轨。看起来一些扩展方法是有序的。
-
你好@Bronumski,你能分享你解决这个问题的方法吗?我在添加相同标题但内容不同的多个线程时遇到相同的问题。
-
@LuisMejia - 我已经更新了 scotts 的答案,并附上了我如何进行 GET 和 POST 的示例。您想要实现的任何其他方法都使用相同的原则。扩展方法包含一个操作,允许您在发送 HttpRequest 之前对其进行操作。
-
@Bronumski 感谢您的回答...似乎我正在采用类似的方式使用 sendasync 并将请求作为参数与自定义标头一起传递。
标签: c# .net oauth authorization dotnet-httpclient