所有信号器交互发生在Hub类之外,因为来自HTTP请求的推送而不是来自客户端通过信号器推送到服务器。
在处理成功的HTTP请求后,我想让通知请求的人旁边的所有客户端都被通知。
谁应该对这些通知负责?处理合法请求后,我的服务器是否应该向客户端发送通知? (这就是我现在所做的)如果这是方法,除了提出请求的人之外我怎样才能通知所有客户?提醒 - 因为请求是Http而不是信号器推送,推送到客户端发生在Hub之外的类中。因此,我不能像您可能建议的那样使用Context或Client.Others属性。我怎么知道应该通知哪些客户?目前我只使用Clients.All和提出请求的人也会收到我不喜欢的通知。
选项2是我的服务器响应成功状态码后。发出请求的客户将负责通知其他客户 - 这意味着他会将消息推送到服务器,而服务器将把该通知推送到所有其他客户端(这次它将在信号器集线器中,所以我可以使用Clients.Others)。
我应该采取哪种方法?
答案 0 :(得分:3)
我认为您的第一种方法是无缝的,并且相当容易实施。此外,您不希望用户负责通知。用户很懒。
所以基本上在你'处理'你的请求之后你没有发现任何异常,你将获得你的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
}