在ASP.NET Core SignalR中,我如何从服务器向客户端发送消息?

26

我已经成功地使用新发布的ASP.NET Core 2.1设置了SignalR服务器和客户端。我通过让ChatHub扩展Hub来构建了一个聊天室:每当来自客户端的消息进入时,服务器就会通过Clients.Others将其发送回去。

但我还不理解如何在不作为响应传入消息的情况下向客户端发送消息。如果服务器正在执行工作并产生结果,我如何获得对Hub的访问以便向特定的客户端发送消息?(或者我甚至需要访问Hub吗?是否有其他方法来发送消息?)

搜索此问题很困难,因为大多数结果来自旧版ASP.NET和SignalR。


1
我自己没有尝试过,但这个视频可能是你需要的:在ASP.NET Core MVC应用程序中使用SignalR进行实时通知 - Peter B
https://github.com/aspnet/SignalR/issues/182 - Lex Li
3个回答

24

您可以将IHubContext<T>类注入到服务中,并使用它来调用客户端。

public class NotifyService
{
    private readonly IHubContext<ChatHub> _hub;

    public NotifyService(IHubContext<ChatHub> hub)
    {
        _hub = hub;
    }

    public Task SendNotificationAsync(string message)
    {
        return _hub.Clients.All.SendAsync("ReceiveMessage", message);
    }
}

现在您可以将NotifyService注入到您的类中,并向所有客户端发送消息:

public class SomeClass
{
    private readonly NotifyService _service;

    public SomeClass(NotifyService service)
    {
        _service = service;
    }

    public Task Send(string message)
    {
        return _service.SendNotificationAsync(message);
    }
}

我对ASP可能有点天真,但是这个服务如何帮助我发送消息呢?如果我在我的代码中有一些HandleEvent函数(在大部分ASP领域之外),我该如何访问此服务、实例化它并使用它呢? - TheBuzzSaw
根据您的问题,我认为您正在尝试从ASP应用程序的不同部分发送消息。如果您正在尝试从不同的项目/应用程序中执行此操作,则需要调用API来代表您发送消息。如果您有一些示例代码可以帮助澄清事情,那将是很有帮助的。 - Simply Ged
我修正了我对ASP.NET服务工作原理的理解,现在这个答案更有意义了。我想这就是我需要的。 - TheBuzzSaw
2
有几个更改需要注意:InvokeAsync 现在已更名为 SendAsync(https://github.com/aspnet/SignalR/issues/1300),并且请确保添加命名空间 using Microsoft.AspNetCore.SignalR; 以获取所需的扩展方法。另请参阅 https://github.com/aspnet/SignalR/issues/2239。 - Simon_Weaver

4

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接