【问题标题】:Integrate signalr with web api to push notifications to clients将 signalr 与 web api 集成以向客户端推送通知
【发布时间】:2016-12-05 08:16:03
【问题描述】:

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

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

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

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

选项 2 是在我的服务器响应成功状态码之后。发出请求的客户端将负责通知其他客户端 - 这意味着他会将消息推送到服务器,然后服务器会将通知推送给所有其他客户端(这次它将在 signalr Hub 中,所以我可以使用客户。其他)。

我应该采取哪种方法?

【问题讨论】:

    标签: c# asp.net-web-api push-notification signalr signalr-hub


    【解决方案1】:

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

    所以基本上在您“处理”了您的请求并且没有发现任何异常之后,您将获得 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);
        }
    

    您必须传入客户端的连接 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; }
        });
    

    SignalR 集线器代码:

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

    客户代码:

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

    【讨论】:

    • 通过选择该选项,我将不得不更改我的所有请求以采用另一个参数 - 客户端 ID?有更好的方法吗?我不想更改所有有效且经过测试的 API
    • 我认为您的代码描述了我的第二个选项 - 让客户端在成功请求后触发推送,对吗?
    • 是的,我最初误读了它并将其解释为“客户”=用户哈哈我是个白痴。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-12
    • 1970-01-01
    • 2011-07-30
    • 2015-03-03
    • 2015-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多