c# - 使用 SignalR 将通知从 Web 应用程序推送到桌面 Windows 窗体应用程序的可行性

标签 c# asp.net winforms notifications signalr

我想在 Web 应用程序和桌面 Winforms 应用程序之间构建一个通知系统。

我希望我的 Web 应用程序将通知推送到我的 Windows 窗体桌面应用程序中,同时我想过滤将传递给用户的消息。我的意思是并非所有连接的用户都会收到所有消息。服务器端(Web 应用程序)将执行一个过滤过程,以确定谁将收到什么。

我希望桌面应用程序在已连接的情况下接收通知,否则将什么也接收不到。如果应用程序未连接或未运行,我不想保存来自服务器的通知。推送的通知将是即时的,不会保存在客户端,它们只会显示。

我还有一个顾虑:如果多个用户同时连接并向服务器请求,会不会影响服务器的性能?

例如,将有 20,000 名用户使用 Windows 窗体应用程序从服务器端(Web 应用程序)接收通知,具体取决于他们的类别。

SignalR 是否支持这种情况?

最佳答案

Does SignalR supports this scenario?

是的,它支持并且适用于实时通知。

您可以使用 groups用于向连接的客户端的指定子集广播消息。但不要将组用于敏感数据。

您可以 track/map连接的客户端,并通过 connectionId/connectionIds 向特定用户/用户通知发送消息。

如果我们谈到性能,20000 个并发连接(我假设并发)确实很多。首先你应该change IIS configuration支持超过 5000 个并发请求。

你应该 optimize signalr for performance .消息大小应该更小。每条消息最大应为 4 Kb(对于这么多并发连接,我建议您少用一些)。

Signalr 使用 Json,因此您可以使用 JsonProperty 来减少消息大小。

[JsonProperty("op")]
public decimal OrderPrice

为什么消息大小很重要?因为每个连接在服务器端都有一个缓冲区。如果客户端可以得到 1 条消息,而此时服务器发送了 2 条消息,则消息将填充到缓冲区中。这些缓冲区使用内存。因此,您应该更小心地处理 20000 个并发连接。否则你将遭受内存消耗。

但在您的情况下,消息大小将不够,您还应该降低此缓冲区限制。

DefaultMessageBufferSize: By default, SignalR retains 1000 messages in memory per hub per connection. If large messages are being used, this may create memory issues which can be alleviated by reducing this value. This setting can be set in the Application_Start event handler in an ASP.NET application, or in the Configuration method of an OWIN startup class in a self-hosted application. The following sample demonstrates how to reduce this value in order to reduce the memory footprint of your application in order to reduce the amount of server memory used:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        // Any connection or hub wire up and configuration should go here
      GlobalHost.Configuration.DefaultMessageBufferSize = 500;
      app.MapSignalR();
    }
}

我建议你使用它 100。减少缓冲区限制有什么缺点?当缓冲区已满时,它不会收到任何新消息。这意味着客户将丢失您的一些通知。因此,如果您的通知是事务性的(用户必须接收),请不要将缓冲区大小减小很多。但如果不是,您可以减少(最小值必须为 32)。

您应该在服务器端和客户端使用 net 4.5 或更高版本,您的客户端应该有 windows8 或更高版本以支持 websocket。

应用这些步骤后,跟踪您的内存消耗并更改消息大小/缓冲区限制/消息频率。

奖励:20000 个并发请求太多了。因此,我建议您使用负载均衡器/scaleup 和 Signalr BackPlane ,如果你遇到性能问题。这样一来,您将没有 1 个网络服务器,比方说 4 个。每个服务器将有 5000 个并发请求(平均)。当您在服务器上发送一条消息时,其他服务器(也是它们的客户端)将通过背板接收消息。有什么缺点?您应该使用共享资源(例如:数据库)来跟踪/映射具有 connectionId 的用户。

关于c# - 使用 SignalR 将通知从 Web 应用程序推送到桌面 Windows 窗体应用程序的可行性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36528412/

相关文章:

c# - 如何在 ASP.NET MVC 6 中继续使用 ModelState 和 RedirectToAction?

c# - 从 DataRow[] 集合中选择一个 DataRow

c# - 如何从 SQL Server 加载图像到图片框?

asp.net - 如何访问在 Docker 中发布的 ASP.NET Swagger API?

c# - 从显示下拉列表不是默认值的下拉列表中捕获值

c# - 有什么有效的解决方案/方法吗?

c# - Winforms Accordion

c# - 运行时的 ASP.Net GridView 和 XMLDataSource 绑定(bind)

c# - MVC3 View 无法找到添加的引用类

C# 正则表达式获取 4 到 10 个字符之间的单词