首页 > 解决方案 > 接收多部分响应并在收到后立即处理每个部分

问题描述

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

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

我已经考虑过我可以使用的WebClient 事件,例如DownloadStringCompletedDownloadProgressChanged,但觉得没有一个是可行的,并且通常认为我走错了路,因此提出了这个问题。我有各种各样的想法,比如将字符串保存到服务器上的临时文件中,并通过并行 SignalR 通道将每个文件名发送到客户端以供客户端并行请求等,但感觉我既会浪费时间又会浪费时间你有机会启发我。

标签: c#asp.net-web-apiwebclient

解决方案


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

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

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

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


推荐阅读