首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用SignalR从ASP.NET MVC 3通知web客户端MSMQ任务已完成。

如何使用SignalR从ASP.NET MVC 3通知web客户端MSMQ任务已完成。
EN

Stack Overflow用户
提问于 2011-11-18 06:48:00
回答 1查看 11.5K关注 0票数 16

如何在由ASP.NET MVC3应用程序(使用表单身份验证)、SQL Server2008数据库和MSMQ WCF服务(托管在WAS中)组成的MSMQ4.0系统中实现通知?运行时环境由运行在Windows Server2008 R2标准版上的IIS7.5组成。

我只玩过这些样本,并没有广泛的SignalR知识。

这里是一些背景

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

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

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

这就是我所做的,

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

使用jQuery,我轮询服务器以获取更改。控制器操作检查是否有任何已修改(完成或失败)的进程并返回它们,否则等待几秒钟,然后再次检查,而不返回给客户端。为了避免客户端超时,如果没有更改,它将在30秒后返回。jQuery脚本等待一段时间,然后重试。

The problems

每一个用户浏览一个页面,性能就会下降。他们不需要做任何特别的事情。我们已经注意到火狐7+和Safari的内存使用量会随着时间的推移而增加。

使用SignalR

我希望切换到SignalR可以减少轮询,从而减少资源需求,特别是在数据库的任务方面没有任何变化的情况下。我很难让WCF服务通知客户端它已经完成了任务处理,因为它使用了基于表单的身份验证。

通过问这个问题,我希望有人能给我更好的洞察力,他们将如何使用SignalR重新设计我的通知方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-11-21 23:56:42

如果我理解正确的话,您需要一种将任务与给定用户/客户端相关联的方法,以便您可以告诉客户端他们的任务何时完成。

SignalR应用程序接口文档告诉我,您可以根据客户端id (https://github.com/SignalR/SignalR/wiki/SignalR-Client)为特定客户端调用JS方法。从理论上讲,你可以这样做:

  1. 按正常方式存储SignalR作为任务的一部分使用的客户端id。
  2. 处理任务并将其出队时:
    • 使用状态更新数据库。
    • 使用作为该任务的一部分存储的客户端id,使用SignalR向该客户端发送notification:

您应该能够检索您的客户端正在使用的连接,并向它们发送一条消息:

代码语言:javascript
复制
string clientId = processedMessage.ClientId //Stored when you originally queued it.
IConnection connection = Connection.GetConnection<ProcessNotificationsConnection>();
connection.Send(clientId, "Your data was processed");

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

编辑:从

代码语言:javascript
复制
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);
     }
}
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8175481

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档