将signaler与web api集成,以向客户端推送通知

本文关键字:客户端 通知 signaler web api 集成 | 更新日期: 2023-09-27 17:59:24

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

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

在处理一个成功的HTTP请求后,我想让除了委托请求的客户端之外的所有客户端都得到通知。

谁应对这些通知负责?在处理完合法请求后,我的服务器是否应该向客户端推送通知?(这就是我目前所做的)如果是这样的话,除了提出请求的客户之外,我如何通知所有客户?提醒-因为请求是Http而不是信号推送,所以向客户端的推送发生在Hub之外的类中。因此,我不能使用上下文或客户端。其他财产,你可能会建议。我怎么知道应该通知哪些客户呢?目前我只使用Clients。所有提出请求的人都会收到通知,我不喜欢。

选项2是在我的服务器响应成功状态代码之后。提出请求的客户端将负责通知其他客户端,这意味着他将向服务器推送消息,然后服务器将向所有其他客户端推送该通知(这次它将在信号集线器内,这样我就可以使用clients.Others)

我应该采取哪种方法?

将signaler与web api集成,以向客户端推送通知

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

因此,基本上,在您"处理"了您的请求并且没有发现任何异常之后,您将获得SignalR Hub Context,并使用内置的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);
    }

您必须传入客户端的连接ID才能使用AllExcept,但这应该是一个相当容易的集成。(注意:如果你直接与SignalR Hub互动,你就不必这样做了)

注意:要使客户端的连接从您的广播中排除,您可以访问它,如:

$.connection.hub.id

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

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

SignalR集线器代码:

public void SomeDataChangeEvent(string connId)
{
    Clients.Others.updateData(_someDataStore.getUpdates().ToList());
}

客户代码:

connection.client.updateData = function() {
    //do stuff
}