首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用SignalR通知ASP.NETMVC 3的Web客户端MSMQ任务已经完成?

如何使用SignalR通知ASP.NETMVC 3的Web客户端MSMQ任务已经完成?
EN

Stack Overflow用户
提问于 2018-03-22 01:24:43
回答 1查看 0关注 0票数 0

如何使用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重新设计我的通知方案。

EN

Stack Overflow用户

发布于 2018-03-22 10:51:10

如果我理解正确,需要将任务关联到给定用户/客户端的方式,以便您可以告诉客户端何时完成任务。

SignalR API文档告诉我您可以根据客户端ID(https://github.com/SignalR/SignalR/wiki/SignalR-Client)为特定客户端调用JS方法。理论上你可以做一些事情:

  1. 将SignalR使用的客户端ID存储为任务元数据的一部分:
  2. 正常排队任务。
  3. 任务处理和出队时:
    • 用状态更新数据库。
    • 使用存储为该任务一部分的客户端ID,使用SignalR向该客户端发送通知:

应该能够检索客户端正在使用的连接并向其发送消息:

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

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

https://github.com/SignalR/SignalR/wiki/Hubs

代码语言: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);
     }
}
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100004290

复制
相关文章

相似问题

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