将SignalR与Web API集成,向客户端推送通知。

7
我正在开发一个应用程序,服务器端技术是asp.net web api,客户端使用的是javascript。在我的应用程序中,我使用Signalr向客户端发送更新通知,即从服务器推送通知到客户端。
所有Signalr交互都发生在Hub类之外,因为推送来自于HTTP请求而不是客户端通过Signalr向服务器进行推送。
在成功处理HTTP请求后,我想让除了提交请求的客户端之外的所有客户端都能够收到通知。
谁应该负责这些通知?在处理合法请求后,我的服务器只需向客户端推送通知吗?(这是我目前所做的)如果这是正确的方法,那么我如何通知除了发出请求的客户端以外的所有客户端?提醒一下 - 因为请求是Http而不是Signalr推送,所以推送到客户端的动作发生在Hub类之外的一个类中。因此,我不能像你可能建议的那样使用Context或Client.Others属性。那我怎么知道应该通知哪些客户端呢?目前,我只使用Clients.All,导致发出请求的客户端也会收到通知,这并不理想。
选项2是,在我的服务器响应成功状态代码后。发出请求的客户端将负责通知其他客户端-这意味着他将向服务器推送消息,然后服务器将向所有其他客户端推送该通知(这一次将在Signalr Hub内进行,因此我可以使用Clients.Others)。
我应该采取哪种方法呢?
1个回答

2
我认为你的第一种方法是无缝的,而且相当容易实现。另外,你不想让用户负责通知,因为用户往往比较懒。
因此,在你处理完请求并且没有捕获到任何异常之后,你需要获取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 Hub,但需要额外的JavaScript代码来触发Hub服务器上的事件。例如:
    $.ajax({
        url: 'Some/Url/',
        type: 'POST',
        success: function (data) { 
                connection.server.someDataChangeEvent(); 
        },
        error: function (ex) { return; }
    });

SignalR Hub 代码:

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

客户端代码:

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

选择这个选项后,我将不得不更改所有请求以接受另一个参数 - 客户端ID?有更好的方法吗?我不想更改所有已经工作和测试过的API。 - user5326354
我认为你的代码描述了我的第二个选项 - 在成功请求后由客户端触发推送,我是对的吗? - user5326354
1
是的,我最初误读并将其解释为“客户端”=用户哈哈,我真是个白痴。 - Mark C.

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