我有一个ASP.NET网站,它使用SignalR集线器向网站用户发送消息。
我有在业务层调用集线器的代码,我使用依赖注入将集线器的实例从我的ASP.NET应用程序注入到业务层。
我遇到的问题是当我在Windows服务中使用我的业务层时,我不知道如何获得集线器的实例。
是否有可能从运行在我的SignalR应用程序中并从我的ASP.NET服务发送广播的服务器“钩”到现有的ASP.NET集线器?
我意识到我可以使用下面的代码作为客户端连接到我的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");发布于 2015-05-30 08:23:47
集线器托管在ASP.NET应用程序中。所以不,您不可能使用service...without的扩展功能直接从windows SignalR广播。
解决方案1(不使用扩展-首选)
Windows服务作为客户端连接到运行在APS.NET应用程序(hub1)中的集线器,并调用向所有客户端广播消息的特殊集线器方法。OFC这种方法可以被普通(浏览器)客户端滥用。为了消除这种情况,您可以在hub2应用程序中创建另一个集线器( ASP.NET ),在这里放置该方法,并使用GlobalHost.ConnectionManager.GetHubContext<hub1>()向连接到hub1的所有客户端广播。Hub2可以保护经授权,所以只有Windows才能使用它。由于您已经在使用DI容器并将集线器注入到您的业务逻辑中,因此应该很容易定义公共接口(INotificationService)并创建两种不同的实现--第一种是在ASP.NET应用程序中使用(使用Hub1进行实际通知),第二种是在Windows中使用,并使用Hub2将通知传递给ASP.NET应用程序。从BL的角度来看,这是一回事.
OFC用于Win Service -> ASP.NET通信,您可以使用任何其他通信技术,如MVC或WebAPI (如@匿名建议的),而不仅仅是SignalR
解决方案2
如果这不是你的解决办法,因为某些原因,有另一个想法。我认为SignalR标度特征可以在这里使用。只需将您的hub1 托管在ASP.NET 和 Windows服务中,即(具有不同的URL和端口!)。尽管客户端将只直接连接到ASP.NET应用程序,但运行在Windows中的代码仍然能够向它们广播消息(消息被传递到扩展消息总线,然后传递到ASP.NET应用程序,然后传递给客户端)。
使用扩展(需要使用Server\Redis或任何其他SignalR背板+延迟等等)要复杂得多,而且您可能希望锁定hub1服务集线器,这样客户端就不能直接连接到它并运行hub1方法(我不知道怎么做--一个想法是使用另一个集线器实现,但使用相同的名称(HubNameAttribute)和空方法+授权,这样就没有人能够连接到它)。不管怎样,这更麻烦了,你应该有充分的理由走这条路.
发布于 2015-05-29 18:31:24
编辑:,因此根据我们的讨论,这里是我对问题的理解:
问题:有一个可以访问SignalR客户端的现有项目,该项目需要响应运行在与这些客户端的项目相同的服务器上的windows服务事件。
My解决方案:我将构建或使用webAPI项目作为服务和服务器项目之间的中间部分。服务可以调用webAPI方法,这些方法反过来访问您的业务级逻辑,然后根据需要更新SignalR客户端。这还具有使Microsoft提供的内置保护可供使用的优点(即任何身份验证方案:窗体、窗口等)。
这教程解释的方法是,为了向客户端广播,首先需要获得对所有连接客户端的引用。
GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>().Clients)有关于如何返回客户端列表的示例吗?
从这里开始,您需要执行类似的操作(再次使用它们的例子):Clients.All.SomeClientMethod(string aParameter)
https://stackoverflow.com/questions/30536554
复制相似问题