如何使用SignalR在由ASP.NET MVC 3应用程序(使用表单例份验证),SQL Server 2008数据库和MSMQ WCF服务(位于WAS中)组成的.NET 4.0系统中实现通知?运行时环境由在Windows Server 2008 R2 Standard Edition上运行的IIS 7.5组成。

我只玩过样本,并且对SignalR并不了解。

这是一些背景

该Web应用程序接受来自用户的数据并将其添加到表中。然后,它调用WCF服务的单向操作(使用数据库密钥)以处理数据(任务)。 Web应用程序返回到页面,告诉用户数据已提交,处理完成后将通知他们。用户可以在“索引”页面上查看哪些任务已完成,失败或正在进行。他们可以继续提交更多任务(与先前的数据无关)。他们可以关闭浏览器,稍后再返回。

基于MSMQ的WCF服务从数据库读取记录并处理数据。这可能需要几毫秒到几分钟的时间。完成数据处理后,记录将更新为相应的状态(错误或失败)和结果。

大多数情况下,WCF服务不执行任何处理,但是当用户进行处理时,用户通常希望尽快知道它何时完成。即使他们没有WCF服务要处理的数据,用户仍将使用Web应用程序的其他部分。

这就是我所做的

在主导航栏中,我有一个指示器(类似于Facebook或Google+),供用户在任务状态更改时通知他们。当他们单击它时,他们会得到所做的摘要,然后可以根据需要查看结果。

使用jQuery,我轮询服务器的更改。 Controller 操作将检查是否有任何已修改(完成或失败)的进程,然后将其返回,否则将等待几秒钟,然后再次检查而不返回客户端。为了避免客户端超时,如果没有更改,它将在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");
    

    假定您已映射此连接,并且客户端首先使用该连接启动了数据处理请求。您的“主导航栏”具有启动与您先前映射的ProcessNotificationsConnection端点的连接的JS。

    编辑:来自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);
         }
    }
    

    10-07 19:16
    查看更多