接收多部分响应并在收到后立即处理每个部分

Receive multipart response and treat each part as soon as received

当前情况:现有SQL 服务器存储过程我无法控制 returns 大约 30 秒内单独结果集中的 10 个大字符串(~每个数据集 3 秒)。收集这些字符串的现有 ASP.NET Web API 控制器方法仅 returns 响应 一旦从存储过程 获得所有字符串。客户端收到响应后,又需要30秒处理字符串和显示结果,从请求发起到操作完成共计1分钟。

预期的改进:一旦从 SqlDataReader 获得字符串,就以某种方式将字符串传输给客户端,这样客户端就可以在接收后续字符串的同时解释每个字符串。从请求发起到完成的总时间将因此大致减半。

我考虑过WebClient events at my disposal, such as DownloadStringCompleted and DownloadProgressChanged,但感觉none是可行的,一般认为我走错了路,所以提出这个问题。我有各种各样的想法,比如将字符串保存到服务器上的临时文件中,通过并行的SignalR通道将每个文件名发送给客户端,让客户端并行请求等等,但是感觉既浪费时间又浪费时间你给我开导的机会。

我不会求助于使用“服务器推送”方法来颠倒标准客户端/服务器关系。您所需要的只是某种中间数据集。它可以是您服务器上的一个单例对象(或多个对象,每个客户端一个),或实际数据库(可能是 NoSql)中的另一个 table。

重点是客户端不会直接访问你正在处理的慢速数据流。相反,客户端将只访问中间数据集。在第一个请求中,您将开始将数据从慢速数据集迁移到中间数据库的过程,客户端将不得不等待第一批准备就绪。

然后,客户端在处理每个结果时会提出额外的请求。如果已经有更多的中间结果可用,他将立即获得它们,否则他将不得不像第一次请求时那样等待。

但是服务器一直在等待慢速数据集并向中间数据集添加更多数据。您将必须有一种方法来将中间数据标记为已发送给客户端或未发送给客户端。您可能希望为将数据从慢速数据源移动到中间数据源的代码生成一个单独的线程。