【问题标题】:Send notification to web client from external service via SignalR hub hosted in Asp.Net MVC Application通过托管在 Asp.Net MVC 应用程序中的 SignalR 集线器从外部服务向 Web 客户端发送通知
【发布时间】:2013-10-08 19:27:46
【问题描述】:

场景如下:我们有一个 Asp.Net MVC 4 应用程序,该应用程序具有一个私有消息系统,该系统托管一个 signalR 集线器,用于在有新消息可供用户使用时通知用户。一切正常,Web App 注册 connectionId 及其用户名,并且信号通过 notificationAdapter 类从 DataLayer 发送到集线器。

当我们不得不利用 Quartz.Net 创建一个单独的服务时,问题就出现了,该服务还可以在任务完成时发送私人消息。我们希望 Quartz 服务能够联系 Hub,但我们不能导致它处于单独的进程中。我不想使用 signalR .net 客户端,因为我不需要基于 Quartz 的服务和我的 Web 应用程序之间的永久连接。我想在我的网站中创建一个端点以将 Hub 的服务器方法公开给服务或为此使用 ScaleOut,但我觉得我错过了一些东西,尽管我会问社区。​​p>

【问题讨论】:

  • 我不知道你为什么不想要永久连接?? SignalR 客户端的全部意义在于集线器之间的进程外通信。你可以按照你的建议去做,但这有点违背了 SignalR 的全部目的,你会失去任何双向通信......
  • @Steve :我想我不想要它,因为我不需要它是永久的或双向的。
  • 您是否考虑过使用总线(RabbitMQ、NServiceBus 等)? Quartz.Net 可以在总线上发布消息,订阅者会接收消息并通过 SignalR 向任何连接的客户端(Web 应用程序)发送警报。
  • @dpwilson 这是迄今为止最好的选择,所以这两个服务都保持解耦,但感觉就像是打败苍蝇的佳能,不是吗?
  • @VdesmedT 我同意如果您不在系统的其他地方使用它,添加服务总线层有点过分。我在您描述的确切情况下使用了总线(甚至使用了 Quartz.net),但我已经在我的应用程序中使用了总线,所以这是一个相当轻松的实现。

标签: c# architecture signalr


【解决方案1】:

这可能是一个非常晚的答案,但因为没有实际接受的答案。我会提供一个。

让您的 Quartz.NET 应用程序向您的 ASP.NET Web 应用程序发送信息而不实现诸如企业服务总线 (ESB) 之类的繁重解决方案的最简单方法是在 ASP.NET 中公开一个 Web 服务并让您的 Quartz .NET 在其任务完成时调用 ASP.NET Web 服务。进入 ASP.NET Web 服务后,您应该能够返回通知,通过 signalR 向客户端发送通知。

【讨论】:

  • 这确实是我当时所做的 ;-) 谢谢
  • @VdesmedT 我现在遇到了同样的问题。您如何限制对 Quartz.NET 应用程序用来推送消息的端点的访问?你是如何确定只有石英服务的其他用户才能调用这个端点的?
【解决方案2】:

我会在 WebAPI 中使用 Quartz 侦听器(作业或触发侦听器),然后它会与 Hub 对话。

当然,在 Quartz 客户端(Web API)和服务器(Windows 服务)之间使用共享的 ADO 存储。

【讨论】:

    猜你喜欢
    • 2014-06-06
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 2012-09-10
    • 2020-01-12
    • 1970-01-01
    • 2014-08-12
    相关资源
    最近更新 更多