如何使用SignalR从ASP通知web客户端.NET MVC 3即MSMQ任务完成
本文关键字:MVC MSMQ 任务 NET 客户端 SignalR 何使用 ASP web 通知 | 更新日期: 2023-09-27 18:14:56
如何在一个由ASP. net . 4.0组成的系统中使用SignalR实现通知?. NET MVC 3应用程序(使用表单认证),SQL Server 2008数据库和MSMQ WCF服务(托管在WAS)来处理数据?运行时环境包括在Windows Server 2008 R2标准版上运行的IIS 7.5。
我只玩过样本,对SignalR没有广泛的了解。
这是一些背景
web应用程序接受来自用户的数据并将其添加到表中。然后调用WCF服务的单向操作(使用数据库键)来处理数据(一个任务)。web应用程序返回到一个页面,告诉用户数据已提交,处理完成时将通知用户。用户可以查看"索引"页面,查看哪些任务已完成、失败或正在进行中。他们可以继续提交更多的任务(这与以前的数据无关)。他们可以关闭浏览器,稍后再回来。
基于MSMQ的WCF服务从数据库中读取记录并处理数据。这可能需要几毫秒到几分钟的时间。当数据处理完成后,记录将更新为相应的状态(错误或失败)和结果。
大多数时候,WCF服务不执行任何处理,但是当它执行时,用户通常希望尽快知道它何时完成。用户仍然会使用web应用程序的其他部分,即使它们没有数据需要WCF服务处理。
这是我所做的
在主导航栏中,我为用户设置了一个指示器(类似于Facebook或Google+),以便在任务状态发生变化时通知他们。当他们点击它时,他们会得到一个所做的总结,然后如果他们愿意,可以查看结果。
使用jQuery,我轮询服务器以获取更改。控制器动作检查是否有任何进程被修改(完成或失败)并返回它们,否则等待几秒钟并再次检查,而不返回到客户端。为了避免客户端超时,如果没有更改,它将在30秒后返回。jQuery脚本等待一段时间并再次尝试。
的问题性能随着每个用户查看一个页面而降低。他们没有必要做任何特别的事情。我们注意到Firefox 7+和Safari的内存使用量随着时间的推移而增加。
使用SignalR我希望切换到SignalR可以减少轮询,从而减少资源需求,特别是如果没有改变任务明智的数据库。由于使用基于表单的身份验证,我很难让WCF服务通知客户端它已经完成了任务的处理。
通过问这个问题,我希望有人能更好地了解他们将如何使用SignalR重新设计我的通知方案,如果有的话。
如果我理解正确的话,您需要一种将任务关联到给定用户/客户端的方法,以便您可以告诉客户端他们的任务何时完成。
SignalR API文档告诉我,你可以根据客户端id (https://github.com/SignalR/SignalR/wiki/SignalR-Client)为特定的客户端调用JS方法。理论上你可以这样做:
- 将SignalR使用的客户端id存储为任务元数据的一部分:
- 任务正常排队。
- 任务被处理和退出队列时:
- 用状态更新数据库
- 使用作为任务一部分存储的客户端id,使用SignalR向该客户端发送通知:
您应该能够检索您的客户端正在使用的连接并向他们发送消息:
string clientId = processedMessage.ClientId //Stored when you originally queued it.
IConnection connection = Connection.GetConnection<ProcessNotificationsConnection>();
connection.Send(clientId, "Your data was processed");
假设您映射了此连接,并且客户机首先使用该连接来启动数据处理请求。你的"主导航栏"有JS启动连接到ProcessNotificationsConnection
端点你之前映射。
EDIT: From https://github.com/SignalR/SignalR/wiki/Hubs
public class MyHub : Hub
{
public void Send(string data)
{
// Invoke a method on the calling client
Caller.addMessage(data);
// Similar to above, the more verbose way
Clients[Context.ClientId].addMessage(data);
// Invoke addMessage on all clients in group foo
Clients["foo"].addMessage(data);
}
}