上图代表我要解决的场景。
根据我之前的经验,我知道进度报告模式可用于解决保持客户端更新但当时客户端直接与集线器通信的问题,这意味着背后没有控制器或代码。
在上图中,问题是控制器在调用数据库之前需要做一些事情。
此外,数据库以文件的形式返回段,因此我添加了一个异步文件系统观察器,用于在每次创建响应文件时通知我。
目标是在您收到响应段时继续为客户端浏览器提供响应段,直到我们到达响应的末尾。
问题是:如何从控制器/服务方法触发 signalR Hub 并继续向客户端浏览器提供响应?
更新:
缩小问题范围
我的控制器调用服务方法
string contents = await _logService. ResponseFileWaiterAsync (myData.guid.ToString());
在该
ResponseFilewaiterAsync
方法中,当创建第一个文件时,我触发集线器BroadcastResponseToClient(responseFilePath, hubConnection); private void BroadcastResponseToClient(string responseFilePath, HubConnection hubConnection) { var hub = hubConnection.CreateHubProxy(typeof(string).Name); hubConnection .Start() .ContinueWith(_ => hub.Invoke("UpdateResponseToClient", ResponseHtml)); }
集线器将响应报告给客户端并查找下一个文件,直到完成
public async Task UpdateResponseToClient(IProgress<string> progress,string filePath) { // Clients.Caller.appendReportToPage(ResponseHtml); string result = await _jbaseLoggingService.ResponseFileWaiterAsync(filePath); progress.Report(result); }
问题:如何从服务方法/控制器触发进度报告中心?更新完成后我应该在哪里完成我的请求——它应该返回到控制器吗?