虽然您的特定情况涉及 Windows Azure 特定(LB 的 4 分钟超时),但问题是纯粹的 IIS / ASP.NET 工作方式。无论如何,我认为在 AsyncController/AsyncPage 中不可能向客户端发送“ping-backs”。这就是 AsyncPages/Controllers 的全部思想。IIS 将套接字放在一边,让线程为其他请求提供服务。并且仅当您使用 AsyncManager.OutstandingOperations.Decrement() 将OutstandingOperations 归零时才返回;只有这样,控制权才会被交还给客户端以发送最终响应。一旦您成为发送响应的重点,就没有回头路了。
我宁愿争论为什么有人会等待 4 分钟才能得到响应的架构方法(即使有一个很好的动画“请稍候”)?这段时间可能会发生很多事情。从浏览器崩溃、互联网中断到客户端完全断电/中断。如果你在做真正的 Azure,为什么不通过队列(Azure 存储队列或服务总线队列)为 Worker 角色发送任务。对于这么长时间运行的任务,您面前的另一个选择是使用 SingalR 和完全 AJAXed 解决方案。您通过 SignalR 传达长期运行操作的状态的位置。
更新 1 由于评论
除了@knightpfhor 建议的方法之外,这也可以通过队列来实现。请求者创建一个具有唯一 ID 的任务并将其发送到“任务提交队列”。然后“侦听”(或定期/不定期轮询)“任务完成”队列以获取具有给定任务 ID 的消息。
无论如何,我看不到在整个长时间运行的任务期间保持客户端连接的理由。有许多方法可以解耦这种通信。