c# - ASP.net Web 应用程序,通过创建服务向浏览器推送通知

标签 c# .net multithreading web-services push-notification

Web 应用程序 Asp.net & C#

我正在开发一个 Web 应用程序,理想情况下将包括通知服务,当用户在浏览器上收到兴趣或类似内容时更新用户。

理论

例如,用户 1 点击用户 2,用户 2 的信息被传递到我的 Web 应用程序进行处理。如果我想在在线/离线时更新用户 2,我需要一个异步处理的进程。当用户 2 登录时,我的应用程序必须检查是否有任何更新和推送,并在用户打开时继续检查。我看到它的方式是,我需要为每个访问我的应用程序的用户指定一个任务,以检查该用户是否有任何更新。如果没有任何更新,该任务将被锁定等待更新。已经有并发连接在等待该任务,因此是消耗量的 2 倍。

问题

我试图找出另一种分配负载的方法,以便我的应用程序可以通过与其他系统或服务通信来优雅地处理推送。由于为每个具有并发连接的用户专门分配一个工作任务将过于占用资源。

研究至今

我研究了一个消息队列系统,看看这是否能解决问题,但在研究时,我似乎会做同样的事情,就像专门处理一个任务来处理每个访问我的应用程序的用户来监听来自队列的任何消息.

或者更糟糕的是,我必须为每个不推荐的用户创建唯一的队列,然后处理消息并为用户是否在线/离线添加更多逻辑。

问题

检查更新的最有效方式是什么,是我上面描述的方式,为使用我的 Web 应用程序的每个用户指定一项任务,还是有另一种设计模式可用于为我的应用程序的该部分提供服务?

我想说的点

使用 signalr 等框架或 commet 或长轮询等方法将客户端连接到我的 Web 应用程序时,我没有问题。

我将 signalR 与 SQLdependancy 一起使用,但存在性能问题。我不能使用 SQL Server 来触发事件,因为如果用户数量增加,它会锁定我服务器上的一个线程,因为每个依赖于 SQL 创建的集线器都会调用 asych/await。从理论上讲,我真的很想将其作为服务复制到我的应用程序中,但不知道如何做到这一点。

最佳答案

我有类似的情况:

在我的应用程序中,我有很多客户端,每个客户端都可以登录多次。例如客户端A和B,客户端A1使用PC桌面浏览器登录,同时使用Android手机登录(我们称之为A2)。客户端 B2 使用 iPhone 登录,同一客户端 B1 电脑桌面浏览器处于离线状态。

然后,当 A1 向 B 发送消息时(不知道 B1 或 B2):

  • A1在IIS中调用Web Services或webapi发送消息,并将消息存储在sql中。
  • A1调用signalr Server,告诉Server有一条消息从A到B。
  • signalr Server 知道当前 A1、A2、B2 在线,所以 Server 调用 A2 和 B2 signalr 客户端更新客户端页面。

  • 这里假设 A2 Android App。在前台和 B 聊天时,屏幕将更新为与 A1 同步。

    这里假设 B2 iPhone App。在后台,会生成本地通知,并在收到signalr消息的同时更新隐藏屏幕,B点击通知时可以看到更新的消息。
  • 一段时间后,当 B1 使用 pc 浏览器登录时,它会调用 webservices 或 webapi 来获取最新消息。

  • 就是这样。我没有sql触发器,没有新消息时一切都是空闲的,除了信号器的心跳(仅在连接状态更改时发生)。

    设计理念是我尝试将加载放在客户端,并且客户端尽可能早地接收消息。

    关于c# - ASP.net Web 应用程序,通过创建服务向浏览器推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30904460/

    相关文章:

    c# - WPF 中的颜色过渡

    c# - 如何更改项目的 .sln 文件的位置?

    c# - 将 GC.AddMemoryPressure 与非托管资源一起使用有什么意义?

    .net - EntityFramework.dll 与 System.Data.Entity.dll -- 歧义

    java - Spring Servlet 3.0 异步 Controller - 什么线程处理响应?

    multithreading - Kotlin Supervisor Job 意外行为

    c# - ModelMetaData、Custom Class Attributes 和一个难以描述的问题

    C# MySql 在数据库中存储一个数组列表

    .net - 奇怪的串行端口名称不起作用

    c# - 如何在 C# 中运行可变数量的并发参数化无限循环类型线程?