HttpClient 和阻塞 PostAsync

问题描述 投票:0回答:1

我知道这是一个流行的 C# 问题。不过我认为我的问题很具体。 我计划向网络服务器发出两个请求。第一个请求是一个长 GET。 Web 服务器不会立即回复,请等待并保持 C# 客户端连接。同时在另一个任务中我正在执行 POST 请求。

问题:如果我设置与第一个请求相同的cookie(PHPSESSION),

PostAsync
会阻塞并等待第一个请求的完成。如果没有 cookie,它不会阻塞(!),但这没有意义。

我尝试过的:

  • 针对每个请求使用
    SendAsync
    HttpRequestMessage
  • 创建新的
    HttpClient
    并复制 cookies。
  • 设置
    ServicePointManager.FindServicePoint(new Uri(url)).ConnectionLimit
  • 尝试在第二个请求中添加随机cookie

C# .NET 4.7.2

问题:如何添加更多并行度?

更新:我想确认:

PostAsync
SendAsync
在没有cookie的情况下不会阻塞。
如果我从长GET复制cookie,请求将被阻塞并等待GET完成。如果我中断长 GET,Post 和 Send 立即成功完成。

c# .net dotnet-httpclient
1个回答
0
投票

这是由 PHP 后端的一种称为会话锁定的机制引起的,该机制将任何脚本的执行限制为每个会话 ID 一个。这是为了防止同一用户会话中出现并发问题。

如果您控制后端,则可以在脚本执行的早期调用

session_write_close()
,以便释放同一会话中的其他请求。

如果您控制后端,那么您唯一的选择就是创建一个新会话。

请注意,会话锁定将应用于给定会话下的所有请求,即使是从不同的浏览器、主机甚至网络发送的请求。

© www.soinside.com 2019 - 2024. All rights reserved.