【问题标题】:Receive multipart response and treat each part as soon as received接收多部分响应并在收到后立即处理每个部分
【发布时间】:2020-11-21 03:21:11
【问题描述】:

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

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

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

【问题讨论】:

  • 这具有 en.wikipedia.org/wiki/XY_problem 的所有特征。请退后一步,从用户的角度具体描述您要解决的实际问题。
  • Roger that - 编辑问题...

标签: c# asp.net-web-api webclient


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    相关资源
    最近更新 更多