将 cookie 从当前 HttpContext 传输到新创建的 HttpClient 请求的简单方法

Posted

技术标签:

【中文标题】将 cookie 从当前 HttpContext 传输到新创建的 HttpClient 请求的简单方法【英文标题】:Simple way to transfer cookies from current HttpContext into new created HttpClient request 【发布时间】:2020-12-10 03:55:34 【问题描述】:

我正在尝试包装一些 api 请求

[Route("foo")]
public Task Foo()

    using var http = new HttpClient();
    return http.PostAsync(
                  Endpoint,
                  new FormUrlEncodedContent(new Dictionary<string, string>
                  
                       ClientId, "ClientId" ,
                  ),
                  CancellationToken.None)
            .ConfigureAwait(false);

并遇到问题。原因在于被调用端点使用的 cookie。

有什么方法可以将 cookie 从我当前的 HttpContex 转移到 HttpClient Post call?我知道,我可以使用CookieContainerHttpClientHandler 并将所有这些东西传递给HttpClient,但我想使用更优雅的东西。

【问题讨论】:

AddHeaderPropagation middleware 够优雅吗? @PeterCsala 绰绰有余,只需要迁移到核心 3.1 【参考方案1】:

只需从传入请求中获取Cookie 标头并添加到传出请求中即可。为单个请求设置标头将需要显式创建 HttpRequestMessage 并使用 HttpClient.SendAsync 发送它,但这相当简单:

var outgoing = new HttpRequestMessage(HttpMethod.Post, uri);
outgoing.Content = new FormUrlEncodedContent(...);
if (Request.Headers.TryGetValue("Cookie", out var cookies))

    outgoing.Headers.TryAddWithoutValidation("Cookie", cookies);

await http.SendAsync(outgoing);

【讨论】:

谢谢,但这与在概念上使用CookieContainer 有区别吗? 是的,它有很大的不同。 CookieContainer 是一种高级抽象,用于以浏览器的方式模拟用户“会话”,它与 HttpClient/Handler 紧密耦合。所有你在你的问题中陈述的你想避免的。这是为单个请求直接转发 cookie 标头的简单方法。

以上是关于将 cookie 从当前 HttpContext 传输到新创建的 HttpClient 请求的简单方法的主要内容,如果未能解决你的问题,请参考以下文章

如何从 .Net core 2.0 中的 HttpContext 获取访问令牌

当前上下文中不存在名称“HttpContext”

.net 标准库中的 HttpContext

IdentityServer Topics- 注销

如何在服务器端 Blazor 中访问 HttpContext?

将 HttpContext 注入到一个类中,并在 .net core 中调用控制器外的类