blo*_*aak 16 c# wcf msmq asp.net-mvc-3 signalr
如何使用SignalR在.NET 4.0系统中实现通知,该系统由ASP.NET MVC 3应用程序(使用表单身份验证),SQL Server 2008数据库和MSMQ WCF服务(托管在WAS中)来处理数据?运行时环境包含在Windows Server 2008 R2 Standard Edition上运行的IIS 7.5.
我只玩了样本,没有广泛的SignalR知识.
这是一些背景知识
Web应用程序接受来自用户的数据并将其添加到表中.然后,它调用WCF服务的单向操作(使用数据库密钥)来处理数据(任务).Web应用程序返回到一个页面,告诉用户数据已提交,并在处理完成时通知他们.用户可以查看"索引"页面,查看哪些任务已完成,失败或正在进行中.他们可以继续提交更多任务(这与以前的数据无关).他们可以关闭浏览器并稍后返回.
基于MSMQ的WCF服务从数据库中读取记录并处理数据.这可能需要几毫秒到几分钟的时间.处理完数据后,记录会以相应的状态(错误或失败)和结果进行更新.
大多数情况下,WCF服务不执行任何处理,但是当它执行时,用户通常希望尽快知道何时完成.即使用户没有要由WCF服务处理的数据,用户仍将使用Web应用程序的其他部分.
这就是我所做的
在主导航栏中,我有一个指示器(类似于Facebook或Google+),供用户在任务状态发生变化时通知他们.当他们点击它时,他们会得到已完成的内容的摘要,然后可以根据需要查看结果.
使用jQuery,我轮询服务器的更改.控制器操作检查是否存在任何已修改(已完成或失败)的进程并返回它们,否则等待几秒钟并再次检查而不返回客户端.为了避免客户端超时,如果没有更改,它将在30秒后返回.jQuery脚本等待一段时间再试一次.
问题
每个查看页面的用户的性能都会下降.他们没有必要特别做任何事情.我们注意到Firefox 7+和Safari的内存使用量会随着时间的推移而增加.
使用SignalR
我希望切换到SignalR可以减少轮询,从而减少资源需求,尤其是在数据库中没有任何改变任务的情况下.我很难通过WCF服务来通知客户端它已完成处理任务,因为它使用基于表单的身份验证.
通过提出这个问题,我希望有人能够更好地了解他们如何使用SignalR重新设计我的通知方案,如果有的话.
如果我理解正确,您需要一种将任务关联到给定用户/客户端的方法,以便您可以告诉客户端他们的任务何时完成.
SignalR API文档告诉我,您可以根据客户端ID(https://github.com/SignalR/SignalR/wiki/SignalR-Client)为特定客户端调用JS方法.理论上你可以这样做:
您应该能够检索客户端正在使用的连接并向他们发送消息:
string clientId = processedMessage.ClientId //Stored when you originally queued it.
IConnection connection = Connection.GetConnection<ProcessNotificationsConnection>();
connection.Send(clientId, "Your data was processed");
Run Code Online (Sandbox Code Playgroud)
这假设您映射此连接,并且客户端使用该连接首先启动数据处理请求.您的"主导航栏"具有JS,它启动了与ProcessNotificationsConnection
您之前映射的端点的连接.
编辑:来自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);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
11279 次 |
最近记录: |