具有不同身份验证标头的 HttpClient 单实例

2024-02-25

鉴于 .net HttpClient 的设计考虑到了重用,并且旨在长寿 http://chimera.labs.oreilly.com/books/1234000001708/ch14.html and 已报告内存泄漏 https://stackoverflow.com/questions/14075026/httpclient-crawling-results-in-memory-leak在短暂的情况下。在为多个用户调用端点时,您希望使用不同的承载令牌(或任何授权标头)对给定端点进行静态调用,有哪些指导原则?

private void CallEndpoint(string resourceId, string bearerToken) {
  httpClient.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("bearer", bearerToken);
  var response = await httpClient.GetAsync($"resource/{resourceid}");
}

鉴于上述代码可以由 Web 应用程序上的任意数量的线程调用,因此第一行中设置的标头很可能与调用资源时使用的标头不同。

在不引起使用锁争用和维护无状态 Web 应用程序的情况下,为单个端点创建和处置 HttpClient 的推荐方法是什么(我当前的做法是为每个端点创建一个客户端)?


生命周期

虽然 HttpClient 确实间接实现了 IDisposable 接口,HttpClient的推荐用法是不要丢弃它 每次请求后。 HttpClient 对象的目的是作为 只要您的应用程序需要发出 HTTP 请求。有对象 存在于多个请求中,可以提供设置的位置 DefaultRequestHeaders 并防止您必须重新指定内容 就像每个请求上的 CredentialCache 和 CookieContainer 一样 HttpWebRequest 所必需的。


如果您的标头通常相同,那么您可以设置DefaultRequestHeaders。但您不需要使用该属性来指定标头。正如您所确定的,如果您要使用同一客户端有多个线程,那么这是行不通的。在一个线程上对默认标头进行的更改会影响在其他线程上发送的请求。

尽管您可以在客户端上设置默认标头并将其应用到每个请求,但标头实际上是请求的属性。因此,当标头特定于请求时,您只需将它们添加到请求中即可。

request.Headers.Authorization = new AuthenticationHeaderValue("bearer", bearerToken);

这意味着您不能使用不涉及创建的简化方法HttpRequest。你需要使用

public Task<HttpResponseMessage> SendAsync(HttpRequestMessage request)

有记录的here https://msdn.microsoft.com/en-us/library/hh138176(v=vs.118).aspx.


有些人发现使用扩展方法将更新标头的代码与方法的其余部分隔离是很有帮助的。

通过扩展方法完成的 GET 和 POST 方法示例,允许您操作请求标头和更多内容HttpRequestMessage在发送之前:

public static Task<HttpResponseMessage> GetAsync
    (this HttpClient httpClient, string uri, Action<HttpRequestMessage> preAction)
{
    var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, uri);

    preAction(httpRequestMessage);

    return httpClient.SendAsync(httpRequestMessage);
}

public static Task<HttpResponseMessage> PostAsJsonAsync<T>
    (this HttpClient httpClient, string uri, T value, Action<HttpRequestMessage> preAction)
{
    var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, uri)
    {
        Content = new ObjectContent<T>
            (value, new JsonMediaTypeFormatter(), (MediaTypeHeaderValue)null)
    };
    preAction(httpRequestMessage);

    return httpClient.SendAsync(httpRequestMessage);
}

然后可以像下面这样使用它们:

var response = await httpClient.GetAsync("token",
    x => x.Headers.Authorization = new AuthenticationHeaderValue("basic", clientSecret));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有不同身份验证标头的 HttpClient 单实例 的相关文章

  • 如何在 C++ 中对四元结构进行有效排序?

    我有一个包含 x y z 和 w 成员的结构 如何高效排序 在 C 中首先按 x 然后按 y 按 z 最后按 w 如果你想实现字典排序 那么最简单的方法是使用std tie实现小于或大于比较运算符或函子 然后使用std sort http
  • 枚举 EMF 时丢失文本

    我在列举发票 emf http www mediafire com kdjwvvo7odyvwa6并将其复制到另一个但文本丢失了 令人惊讶的是 当我将其输出到窗口时 它绘制得非常完美 int CALLBACK EnhMetaFileProc
  • 如何通过实体键添加/删除与实体框架的多对多关系?

    I tried using Entities e new Entities EntityKey key new EntityKey Entities Users UserId 20 User user new User EntityKey
  • 用于轻松动态反射的 C# 库

    是否有任何库 例如开源项目等 可以更轻松地使用复杂的反射 例如动态创建对象或类 检查实例等 Thanks 有一个LinFu http www codeproject com KB cs LinFuPart1 aspx可用的库除了反射之外还可
  • MouseDoubleClick 事件不会冒泡

    我的场景经过简化 我有一个包含员工行的 ListView 在每个员工行中 都有 增加 和 减少 按钮来调整他的工资 假设在我的程序中 双击 员工 行意味着 解雇此人 The problem是当我快速单击 增加 时 这会触发 ListView
  • 会员提供商使用还是不使用?

    我正在开发一个使用 Facebook 的网站 现在为了管理用户我想使用MembershipProvider并选择开发一个定制的会员提供商 我的问题是我的数据库架构与标准成员资格架构不匹配 并且提供的用于覆盖的函数采用与我预期不同的参数 例如
  • Apple IOS 上的 C# 应用程序 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有基于 C Net 的应用程序 有什么方法可以在 Apple IOS 上运行这些应用程序吗 我没有资
  • gcc 删除内联汇编代码

    看起来 gcc 4 6 2 删除了它认为函数中未使用的代码 test c int main void goto exit handler asm volatile jmp 0x0 exit return 0 拆解main 0x0804840
  • 使用 c# 中的 c++ ref 中的引用从 C# 调用 C++ 代码错误

    所以在我的 c dll 文件中我得到了以下函数 DLL void GetUserPass char userName char passWord userName ceva passWord altceva 现在我想从 c 调用它 但它给了
  • 使用 OpenSSL 库在 C++ 中生成 SHA 哈希值

    如何使用以下命令生成 SHA1 或 SHA2 哈希值OpenSSL https openssl org图书馆 我搜索了谷歌 找不到任何函数或示例代码 从命令行来看 很简单 printf compute sha1 openssl sha1 您
  • 为什么C++中没有“NULL引用”?

    我正在阅读 C 常见问题解答 8 6 什么时候应该使用引用 什么时候应该使用指针 http www parashift com c faq lite refs vs ptrs html 特别是以下声明 可以时使用引用 必要时使用指针 上述情
  • 如何在PropertyGrid中自定义绘制GridItem?

    我想以与所有者在 ListView 详细信息 和其他控件中绘制项目类似的方式在 PropertyGrid 中绘制属性值 如果将属性声明为 Color 类型 则其值将使用字符串描述旁边的颜色样本来绘制 如果属性是图像类型 则在字符串描述旁边绘
  • 随机排列

    我无法找到一种随机洗牌元素的好方法std vector经过一些操作后 恢复原来的顺序 我知道这应该是一个相当简单的算法 但我想我太累了 由于我被迫使用自定义随机数生成器类 我想我不能使用std random shuffle 无论如何这没有帮
  • Sharepoint 的 CAML 查询中的日期时间比较

    我正在尝试从共享点列表中获取某些项目 具体取决于自定义列中的日期 我已经使用 U2U Caml Builder 创建了查询 这很有效 但是当我将其放入 Web 部件中自己的代码中时 它总是返回列表中的所有项目 这是我的代码 DateTime
  • AllowUserToAddRows 不适用于 DataGridView 上的 List<> 数据源

    我有一个DataGridView与DataSource set to List
  • 使用客户端 hello 消息进行 TLS 协议检测

    我需要检测网络流量中的 https 数据包 到目前为止 我将所有 443 标记为 https 但我不想再在这种情况下使用端口信息 检查客户端问候消息是否足够 Check 22 and version info 0300 0301 or 03
  • 如何获取数字列的确切类型,包括。规模和精度?

    有没有办法知道列中列的确切类型DataTable 现在我正在这样做 DataTable st dataReader GetSchemaTable foreach DataColumn col in st Columns var type c
  • 如何正确对齐 WPF GeometryGroup 中的路径?

    我正在使用一个GeometryGroup在圆的中心绘制一个符号 下面的示例显示了我在对此进行实验时的尝试之一 它具有从同一原点 32 32 出发的三条直线
  • 如何重写(重新实现)QFileSystemModel 中的成员函数

    我已经为此苦苦挣扎了一段时间 Qt s QFileSystemModel由于图标获取算法非常糟糕 在获取数百个文件时速度非常慢 我想完全禁用图标 它们被提取到QFileSystemModel data方法不是虚拟的 QFileSystemM
  • 创建进程的多个子进程并维护所有 PID 的共享数组

    我已经分叉了几次 并用 C 创建了一堆子进程 我想将它们所有的 PID 存储在一个共享数组中 PID 的顺序并不重要 例如 我创建了 32 个进程 我想要一个 32 个整数长的数组来存储每个 PID 并且每个进程都可以访问 最好的方法是什么

随机推荐

  • 通过电子邮件将 Sparkline 图表作为 Google Sheets 范围内的图像/博客/png 发送

    我尝试将此解决方案应用于我的案例 通过电子邮件发送 SPARKLINE 图表会发送空白单元格而不是数据 https stackoverflow com questions 50133870 emailing sparkline charts
  • S3方法帮助(roxygen2)

    我正在尝试在包中使用 S3 方法 并认为在此处提出问题后我明白了如何设置它 使用 Roxygen 构建 R 包时 S3 方法一致性警告 https stackoverflow com questions 14237018 s3 method
  • 如何在声明式管道中使用 NodeLabel 参数插件

    我正在尝试将我的自由式作业转换为声明性管道作业 因为管道提供了更大的灵活性 我不知道如何使用 NodeLabel 参数插件 https wiki jenkins io display JENKINS NodeLabel Parameter
  • 如何为提交按钮添加事件监听器

    我在这个 html 上遇到了很多麻烦 我正在尝试向提交按钮添加事件侦听器 以便最终可以更改文档以显示表单信息 问题是 当填写表单时 按钮侦听器不执行任何操作 它可以在 jsfiddle 和其他类似的东西中工作 但不能作为独立文件工作 这让我
  • div 中的水印背景图片

    我想从存储的图像创建水印 但水印会影响上层 并缩小所有分区的颜色 div style background url blogthreadlist blogUri no repeat background position center di
  • Hive alter table 更改列名称为重命名的列提供“NULL”

    我曾尝试将表中的现有列重命名为新列 但名称更改后 新列只给我 NULL 值 Parquet 中表的存储格式 例如 user 是 Test 表中字符串数据类型的列 插入了值为 John 的示例记录 Select user from Test
  • 如何编写 VB.Net Lambda 表达式

    我现在正在开发一个 VB net 项目 我是 VB Net LINQ 的新手 想了解 Lambda 的等效项 var new orders Select x gt x items gt 0 在 VB Net 中 有人请推荐一下 lambda
  • MongoDB 中不区分大小写的排序

    如何按给定字段对 MongoDB 集合进行排序 不区分大小写 默认情况下 我先得到 A Z 然后再得到 a z Update 截至目前 mongodb 的索引不区分大小写 Users find collation locale en sor
  • TensorFlow 将函数应用于矩阵变量的每一行

    嗨 我是 Tensorflow 的新手 我想要在 R 中做这样的事情 mat tf Variable matrix 1 4 nrow 2 apply mat 1 cumprod 这在 Tensorflow 中可行吗 无论是在 Python
  • 从node-webkit访问USB设备?

    我正在构建一个需要在所有 3 个主要桌面环境 Windows Mac 和 Linux 上运行的 Node WebKit 应用程序 我需要我的应用程序连接到插入的 USB 设备 但我在精确计算时遇到了一些麻烦如何解决这个问题 是否有一个适用于
  • 在powerpoint中使用vba将两个形状合并为并集

    我正在尝试使用 union 属性将两个相同的形状合并为一个 编译代码时 它显示对象 commandbar 的方法 executemso 失败 我是 vba 新手 所以如果有人帮助我解决这个问题那就太好了 Sub ShapesUnion Di
  • 在Jboss wildfly和docker中使用cli时出现权限错误

    我扩展了一个 docker 镜像 在构建 dockerfile 时 我调用 Wildfly CLI 添加数据源 然后 当我尝试运行 dockerfile 时 出现以下错误 appui dev local appui dev local JB
  • Rails 3.2 中每个模型是否可以有多个夹具文件?

    在 Rails 3 2 中 给定的 ActiveRecord 对象是否可以有多个固定文件 客户要求将测试数据写入固定装置中 但也希望它们易于管理 我想通过引入第二组来稍微分割一下固定装置 原始版本将包括 需要 渲染任何内容 我无法通过谷歌找
  • 重写 git 历史记录,使 crlf 保持一致

    我有一个 git 存储库 其中有 LF 和 CRLF 文件的细微变化 在进行可能的切换之前 我想重写父提交和当前提交具有 不同 LR CRLF 编码的提交 所以我尝试了以下 一行 稍作编辑 我尝试运行todos如果文件的父版本包含 CR g
  • 通过 destruct+move 构造进行的移动分配安全吗?

    这是使用移动构造函数为大多数类定义移动赋值的一种非常简单的方法 class Foo public Foo Foo foo you still have to write this one Foo operator Foo foo if th
  • 显示底部导航栏但未选择任何项目

    这是我的底部导航栏 现在我想显示底部导航栏 但最初没有选择它的任何项目 当我将 selectedIndex 设置为 null 时 我收到错误 有什么办法可以实现这个目标吗 int selectedIndex 0 BottomNavigati
  • “Help”字符串变量替换“configure --help”

    我有一个字符串 我想多次使用它来输出configure help 所以我尝试做这样的事情configure ac AC ARG ENABLE foobar AS HELP STRING enable foobar foobar help s
  • Jest、Typescript、ts-jest:覆盖范围略有不正确

    我正在使用 TypeScript Jest 和ts jestNPM 模块 当我运行测试时 我确实获得了一定的覆盖范围 但 HTML 报告不太正确 此外 某些函数被标记为未经测试 即使它们确实被调用 我的package json设置如下 je
  • 在 OCaml 中的 let 命令(即 let _ = ... in)中使用下划线通配符有副作用吗?

    使用 OCaml 时 我几乎总是使用下划线通配符let exp 特别是当结果exp并不重要 重要的是里面的计算 例如 let print endline abc in let a a 1 in let do some thing in 所以
  • 具有不同身份验证标头的 HttpClient 单实例

    鉴于 net HttpClient 的设计考虑到了重用 并且旨在长寿 http chimera labs oreilly com books 1234000001708 ch14 html and 已报告内存泄漏 https stackov