将信号器与web api集成以向客户推送通知

5 c# push-notification signalr asp.net-web-api signalr-hub

我开发了一个应用程序,服务器端技术是asp.net web api,客户端是javascript.在我的应用程序中,我使用Signalr通知客户端更新 - 从服务器到客户端的推送通知.

所有信号器交互都发生在Hub类之外,因为来自HTTP请求的推送而不是来自客户端通过信号器推送到服务器.

在处理成功的HTTP请求之后,我想让通知请求的人旁边的所有客户端都得到通知.

谁应该对这些通知负责?在处理合法请求后,我的服务器是否应该向客户端发送通知?(这就是我现在所做的)如果这是方法,除了提出请求的人之外我怎样才能通知所有客户?提醒 - 因为请求是Http而不是信号器推送,推送到客户端发生在Hub之外的类中.因此,我不能像您可能建议的那样使用Context或Client.Others属性.我怎么知道应该通知哪些客户?目前我只使用Clients.All和发出请求的人也会收到我不喜欢的通知.

选项2是在我的服务器响应成功状态代码之后.发出请求的客户将负责通知其他客户端 - 这意味着他会将消息推送到服务器,服务器将把该通知推送到所有其他客户端(这次它将在信号器集线器中,所以我可以使用Clients.Others).

我应该采取哪种方法?

Mar*_* C. 2

我认为你的第一种方法是无缝的并且相当容易实施。另外,您不希望用户负责通知。用户是懒惰的。

因此,基本上在“处理”请求并且没有捕获任何异常之后,您将获得 SignalR Hub 上下文并使用内置 SignalR C# API 向除发送者之外的每个客户端广播消息。

这是一些将进入您的代码Controller

    [Route("ProcessMessage")]
    public async void ProcessMessage(string[] clientConnectionStrings)
    {
        // do some processing
        var hub = GlobalHost.ConnectionManager.GetHubContext<MessagingHub>();

        hub.Clients.AllExcept(clientConnectionStrings);
    }
Run Code Online (Sandbox Code Playgroud)

您必须传入客户端的连接 ID 才能使用,AllExcept但这应该是一个相当简单的集成。(注意:如果您直接与 SignalR Hub 交互,则无需执行此操作)

注意:要从广播中排除客户端的连接,您可以像以下这样访问它:

$.connection.hub.id

另一种方法是直接使用 SignalR Hub,但需要额外的 JavaScript 代码来触发 Hub 服务器上的事件。例如:

    $.ajax({
        url: 'Some/Url/',
        type: 'POST',
        success: function (data) { 
                connection.server.someDataChangeEvent(); 
        },
        error: function (ex) { return; }
    });
Run Code Online (Sandbox Code Playgroud)

SignalR 集线器代码:

public void SomeDataChangeEvent(string connId)
{
    Clients.Others.updateData(_someDataStore.getUpdates().ToList());
}
Run Code Online (Sandbox Code Playgroud)

客户代码:

connection.client.updateData = function() {
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)