C# 如何使用共享 HttpClient 传递 cookie

2023-11-27

我进行了以下设置:

JS 客户端 -> Web Api -> Web Api

我需要将身份验证 cookie 一路向下发送。我的问题是将其从一个 Web api 发送到另一个。由于与使用 FormsAuthentication 的旧系统集成,我必须传递身份验证 cookie。

出于性能原因,我在以下字典中共享 HttpClient 列表(每个 Web api 一个):

private static ConcurrentDictionary<ApiIdentifier, HttpClient> _clients = new ConcurrentDictionary<ApiIdentifier, HttpClient>();

因此,给定一个标识符,我可以获取相应的 HttpClient。

以下有效,但我很确定这是错误的代码:

HttpClient client = _clients[identifier];
var callerRequest = HttpContext.Current.Items["MS_HttpRequestMessage"] as HttpRequestMessage;
string authCookieValue = GetAuthCookieValue(callerRequest);

if (authCookieValue != null)
{
    client.DefaultRequestHeaders.Remove("Cookie");
    client.DefaultRequestHeaders.Add("Cookie", ".ASPXAUTH=" + authCookieValue);
}

HttpResponseMessage response = await client.PutAsJsonAsync(methodName, dataToSend);

// Handle response...

问题在于 1)操纵似乎是错误的DefaultRequestHeaders在一个请求中,2) 两个同时发生的请求可能会弄乱 cookie,因为 HttpClient 是共享的。

我已经搜索了一段时间但没有找到解决方案,因为大多数遇到匹配问题的人都会为每个请求实例化 HttpClient,因此能够设置所需的标头,这是我试图避免的。

有一次我收到了使用以下命令工作的请求HttpResponseMessage。也许这可以为解决方案提供灵感。

所以我的问题是:有没有一种方法可以使用 HttpClient 为单个请求设置 cookie,这样对于使用同一实例的其他客户端来说是安全的?


您可以使用 HttpRequestMessage 和 SendAsync(),而不是调用 PutAsJsonAsync():

Uri requestUri = ...;
HttpMethod method = HttpMethod.Get /*Put, Post, Delete, etc.*/;
var request = new HttpRequestMessage(method, requestUri);
request.Headers.TryAddWithoutValidation("Cookie", ".ASPXAUTH=" + authCookieValue);
request.Content = new StringContent(jsonDataToSend, Encoding.UTF8, "application/json");
var response = await client.SendAsync(request);

更新: 要确保您的 HTTP 客户端不存储响应中的任何 cookie,您需要执行以下操作:

var httpClient = new HttpClient(new HttpClientHandler() { UseCookies = false; });

否则,您可能会因使用一个客户端并共享其他 cookie 而出现意外行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 如何使用共享 HttpClient 传递 cookie 的相关文章

  • 我如何才能等待多个事情

    我正在使用 C 11 和 stl 线程编写一个线程安全队列 WaitAndPop 方法当前如下所示 我希望能够将一些内容传递给 WaitAndPop 来指示调用线程是否已被要求停止 如果 WaitAndPop 等待并返回队列的元素 则应返回
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 按成员序列化

    我已经实现了template
  • 秒表有最长运行时间吗?

    多久可以Stopwatch在 NET 中运行 如果达到该限制 它会回绕到负数还是从 0 重新开始 Stopwatch Elapsed返回一个TimeSpan From MSDN https learn microsoft com en us
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • Clang 3.1 + libc++ 编译错误

    我已经构建并安装了 在前缀下 alt LLVM Clang trunk 2012 年 4 月 23 日 在 Ubuntu 12 04 上成功使用 GCC 4 6 然后使用此 Clang 构建的 libc 当我想使用它时我必须同时提供 lc
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 使用 WebClient 时出现 System.Net.WebException:无法创建 SSL/TLS 安全通道

    当我执行以下代码时 System Net ServicePointManager ServerCertificateValidationCallback sender certificate chain errors gt return t
  • C#中如何移动PictureBox?

    我已经使用此代码来移动图片框pictureBox MouseMove event pictureBox Location new System Drawing Point e Location 但是当我尝试执行时 图片框闪烁并且无法识别确切
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 对现有视频添加水印

    我正在寻找一种用 C 在视频上加水印的方法 就像在上面写文字一样 图片或文字标签 我该怎么做 谢谢 您可以使用 Nreco 视频转换器 代码看起来像 NReco VideoConverter FFMpegConverter wrap new
  • 如何从两个不同的项目中获取文件夹的相对路径

    我有两个项目和一个共享库 用于从此文件夹加载图像 C MainProject Project1 Images 项目1的文件夹 C MainProject Project1 Files Bin x86 Debug 其中有project1 ex
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定

随机推荐

  • SVN(服务器 - 预提交挂钩):了解正在提交的文件列表

    我想知道如何获取在预提交挂钩上提交的文件列表 如果该列表不包含特定路径中的特定文件 那么我想拒绝提交 钩子脚本应该使用svnlook命令与否svn The svnlook命令可以采取交易号提交的 如果这是预提交挂钩 则需要使用事务号 如果这
  • Common lisp :KEY 参数使用

    The KEY参数包含在 Common Lisp 附带的一些函数中 我发现的所有关于它们的描述都没有帮助 并且 KEY在搜索引擎中很难搜索 因为 通常被忽略 例如 它将如何使用member函数允许两者 TEST and KEY The ke
  • 运行 firebase 部署时未找到 404 页面

    我使用 React 和 Google 的 Firebase 构建了一个令人惊叹的网络应用程序auth和数据库 在我的本地服务器上 一切运行良好 我可以对某些用户进行身份验证 并在成功登录后导航到下一页 当使用 firebase 托管部署我的
  • make 用于编译 — 项目中文件夹和子文件夹中的所有 *.c 文件

    为了编译两个文件 我创建了一个 makefile 在其中提及对象名称 或者我可以使用 patsubst 来使用模式规则 Makefile for building tapp Copyright 2010 FriendlyARM http w
  • “==”和“是”有区别吗?

    这个问题的答案是社区努力 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 My 谷歌 fu让我失望了 在 Python 中 以下两个相等测试是否等效 n 5 Test one if n 5 print Yay Test two if
  • typedef struct :默认初始化

    typedef struct foo bool my bool int my int foo 在上面的例子中我明白了my bool将被随机初始化为 true 或 false 但怎么样my int 我假设my int默认初始化为 0 但情况似
  • 获取使用 git-svn 重命名的 SVN 存储库的完整历史记录

    我有一个 SVN 存储库 已从 Project 重命名为 Project v1 然后我做了一个git svn clone创建重命名的 SVN 文件夹的 git 版本 When I git log在新创建的 git 存储库中 我只看到一个历史
  • Select2 4.0.0 Bootstrap 主题

    在select2 4 0版本中有一个主题选项 但是在文档中我找不到该选项的含义以及如何创建自定义主题 https select2 github io examples html 我找到了 select2 的 bootstrap 3 主题 但
  • ESP8266 for Arduino IDE (xtensa-lx106-elf-gcc) 和 std::map 链接错误

    是否可以将地图与 ESP8266 一起用于 Arduino 包 这是我的代码 include
  • 如何在CSS选择器中排除特定的类名?

    当用户鼠标悬停类名为的元素时 我尝试应用背景颜色 reMode hover 但我不想改变颜色 如果元素also has reMode selected 注意 我只能使用 CSS 而不是 javascript 因为我在某种有限的环境中工作 为
  • 聚合物预载旋转器

    有时聚合物加载需要一段时间 并且在使用时 页面保持空白 直到一切准备就绪 有没有办法在页面提供服务和聚合物完成其魔力的时间之间显示某些内容 The 文档描述了unresolved属性清除了其中一些问题 虽然申请很常见unresolved t
  • 如何使用 React.js 在 Sails.js 上渲染服务器端模板?

    我正在尝试使用 Sails js 和 React 构建一个同构应用程序 客户端部分很简单 但我遇到了服务器端渲染的问题 当我尝试使用 React 服务器渲染 jsx 文件时 我得到了以下信息 renderToString You must
  • 使用 Retrofit v1.9.0 添加重复参数

    有一个类似的问题被问到here 但我的情况有点不同 我正在尝试提出类似于以下内容的请求 我有两个问题让事情变得困难 首先 重复参数 多次设置 foo 的值 会阻止使用QueryMap 我无法选择以不同的方式传递查询字符串中的值 就像作为数组
  • 选择递增整数

    我想知道是否可以从mysql表中选择递增的整数 如果可能的话 我怎样才能实现这一目标 我的情况是 我有一堆数据 我需要做INSERT INTO newtable SELECT somefield FROM sometable 然而 有一个字
  • Restangular POST 始终为空

    我想我不明白 POST 是如何在 RESTful api 中完成的 当在 Restangular 中创建一个新对象时 var user name John id 123 Restangular one building 5 post use
  • IIS7:为所有 aspx 页面设置“无缓存”,但不包括图像/css/js

    我不想在任何地方缓存我的 aspx 页面 由于某种原因 IE 忽略从我的母版页设置的元标记 我想看看是否可以将 Http 响应标头设置为 Cache Control no cache 设置类似 HttpContext Current Res
  • WiX XmlConfig:在 XmlConfig 中嵌套 XmlConfig 的目的

    目的和 或收益是什么 除了增加创建 删除属性的可读性之外 嵌套一个XmlConfig另一个元素中的元素XmlConfig元素 我所指的示例 我正在使用WiX 3 6
  • 将 Castle Windsor 与 SignalR 集成 - 我应该如何处理这个问题?

    我正在开始使用 SignalR 一旦配置完所有内容 它就可以很好地工作 然而 我开发的几乎所有应用程序都使用 Castle Windsor 因此能够将它们一起使用会很棒 我想这样做的原因是这样我可以在持久连接内使用 Castle 依赖项 服
  • 如何将包含“include”关联的记录转换为 JSON

    如果我做类似的事情 result Appointment find all include gt staff logger debug result inspect 那么它只打印出约会数据 而不打印出相关的员工数据 如果我执行 result
  • C# 如何使用共享 HttpClient 传递 cookie

    我进行了以下设置 JS 客户端 gt Web Api gt Web Api 我需要将身份验证 cookie 一路向下发送 我的问题是将其从一个 Web api 发送到另一个 由于与使用 FormsAuthentication 的旧系统集成