gpt4 book ai didi

c# - 从同一服务器上的 Windows 服务发送在 ASP.NET MVC 应用程序中运行的 SignalR 广播

转载 作者:行者123 更新时间:2023-11-30 16:54:26 25 4
gpt4 key购买 nike

我有一个 ASP.NET 网站,它使用 SignalR 中心向网站用户发送消息。

我有在我的业务层中调用集线器的代码,我使用依赖注入(inject)将集线器的实例从我的 ASP.NET 应用程序注入(inject)到我的业务层。

我遇到的问题是,当我开始在 Windows 服务中使用我的业务层时,我不知道如何获取集线器的实例。

是否可以从服务器“ Hook ”到我现有的 SignalR 集线器,这些集线器在我的 ASP.NET 应用程序中运行并从我的 Windows 服务发送广播?

我意识到我可以使用以下代码在我的 Windows 服务中作为客户端连接,但这是错误的方法,我想从服务器 发送广播...

// This code enables a client connection
var connection = new HubConnection("http://localhost:3537/");
IHubProxy myHub = connection.CreateHubProxy("NotificationHub");

connection.Start().Wait();

myHub.Invoke("setNotificationCount", "5");

最佳答案

您的中心托管在 ASP.NET 应用程序中。所以不,如果不使用 SignalR 的横向扩展功能,您无法直接从 Windows 服务广播...

解决方案 1(不使用横向扩展 - 首选):

Windows 服务作为客户端连接到在 APS.NET 应用程序 (hub1) 中运行的集线器,并调用特殊的集线器方法,该方法向所有客户端广播消息。 OFC 这种方法可以被普通(浏览器)客户端滥用。要消除这种情况,您可以在 ASP.NET 应用程序中创建另一个集线器 (hub2),将方法放在此处并使用 GlobalHost.ConnectionManager.GetHubContext<hub1>()向连接到 hub1 的所有客户端广播。 Hub2可以保护by authorization所以只有 Windows 服务可以使用它。由于您已经在使用 DI 容器并将集线器注入(inject)业务逻辑,因此应该很容易定义通用接口(interface) (INotificationService) 并创建两个不同的实现 - 首先将在 ASP.NET 应用程序中使用(使用 Hub1 进行实际通知),第二个将在 Windows 服务内部使用,并使用 Hub2 将通知传递给 ASP.NET 应用程序。从BL的角度来看,是同一个东西...

OFC for Win Service -> ASP.NET 通信,你可以使用任何其他通信技术,如 MVC 或 WebAPI(如@Pseudonym 建议),而不仅仅是 SignalR

方案二

如果出于某种原因这不是您的解决方案,还有另一种想法。我想SignalR scaleout feature可以在这里(误)使用。只需在 ASP.NET Windows 服务(使用不同的 URL 和端口!)中托管您的 hub1 两者。即使客户端将仅直接连接到 ASP.NET 应用程序,在 Windows 服务内运行的代码仍然能够向它们广播消息(消息被传递到横向扩展消息总线,然后传递到 ASP.NET 应用程序,然后传递到客户端)。

使用横向扩展(需要 SQL Server\Redis 或任何其他 SignalR 背板 + 延迟等),事情会更加复杂,您可能希望锁定 Windows 服务中心,以便客户端无法直接连接到它并运行 hub1 方法(我'我不确定该怎么做——一个想法是使用另一个集线器实现,但具有相同的名称(HubNameAttribute)和空方法+授权,因此没有人可以连接到它)。无论如何,这更麻烦,你应该有充分的理由走这条路......

关于c# - 从同一服务器上的 Windows 服务发送在 ASP.NET MVC 应用程序中运行的 SignalR 广播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30536554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com