将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)
我应该采取哪种方法?
我认为您的第一种方法是无缝的,并且很容易实现。此外,您不希望用户负责通知。用户是懒惰的。
因此,基本上,在您"处理"了您的请求并且没有发现任何异常之后,您将获得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
}