gpt4 book ai didi

angularjs - SignalR 2-多个集线器实例时,客户端不会收到从服务器发送的所有消息

转载 作者:行者123 更新时间:2023-12-02 22:39:10 25 4
gpt4 key购买 nike

编辑:

我一直在做一些其他的测试,并且这似乎仅在我运行承载SignalR集线器的Web角色的多个实例时才发生(我正在使用azure服务总线底板)。当我运行集线器的单个实例时,我看到所有消息都传递到客户端。当我运行多个实例时,出现以下症状:


从服务器记录表明已发送所有消息
从客户端登录表明仅收到了一些消息
在Azure上远程访问云服务时通过Wireshark查看服务器流量,仅捕获客户端收到的消息


我的怀疑是,客户端拥有与Web角色的单个实例的连接,并且当消息恰好来自未与客户端连接的Web角色发出时,即使将其广播到客户端,客户端也无法接收到该消息。正确的SignalR连接。

运行网站上托管的多个SignalR集线器实例时,是否还有其他人缺少消息?有办法解决这个问题吗?



我有一个异步过程,该过程是通过javascript客户端的API调用启动的,该异步过程完成于通过SignalR集线器发送回该客户端的一条或多条消息。似乎不是所有从SignalR集线器发送的消息都被javascript客户端接收。以下是我收到的日志消息流:


客户端连接到我们的SignalR集线器,然后立即调用订阅方法,该方法将当前连接ID与我们的内部用户标识符相关联:


Websocket已打开
现在,监视保持活动状态,警告超时为13333.333333333332,连接丢失超时为20000。
触发中心“ EventHub”上的客户端中心事件“已订阅”
客户端订阅了事件中心:5539368b-5f82-48bd-8ed9-2c5bed3caefa [这表明后端将给定的连接ID与用户ID相关联]

我启动了后端过程,该过程应导致将两条消息发送回此客户端。从SignalR集线器内记录表明已发送了两条消息(消息列出了与给定内部用户ID相关联的所有连接-我的缓存中有旧的连接,还没有清除):


事件集线器广播控制操作已更新为用户124,用于针对连接5aaea44a-7810-45b5-8119-3ff1fe613d63、4be9ca16-1e31-42bf-91db-798b757a381c,5f9f9962-4f8b-4712-929e-c943e28ca91f,de7135ba-4e16-e9e -9c38-e8f78ed59636、82e900d1-005e-4bff-95d0-3737632b4671、0cc273f9-04aa-4570-8cd7-993876219e52、2b6db0f7-ab0c-41d3-beb5-3b312107a923、5539368b-5f82-48bd-8e9ca从上述[3c5bed包含在列表中]
事件集线器广播控制操作已更新为用户124,用于连接5aaea44a-7810-45b5-8119-3ff1fe613d63、4be9ca16-1e31-42bf-91db-798b757a381c,5f9f9962-4f8b-4712-929e-c943e28ca91f,de7135ba-4e16-4e9e -9c38-e8f78ed59636、82e900d1-005e-4bff-95d0-3737632b4671、0cc273f9-04aa-4570-8cd7-993876219e52、2b6db0f7-ab0c-41d3-beb5-3b312107a923、5539368b-5f82-48bd-8e9ca从上述[3c5bed包含在列表中]

在客户端上,我正在记录发送消息后调用该方法的时间,并且看到:


从事件中心收到的模型为:controlActionId 120的controlActionUpdated消息



有时,客户端会收到来自集线器的所有消息,但更常见的是,它丢失了一两个。相关代码段如下:

客户:

我们在angularjs中使用通用事件服务。事件使用者连接并订阅事件列表,如下所示:

eventing.initialize(['controlActionUpdated', 'subscribed']);

该服务如下所示:

var cn;
var hubProxy;
var eventsToHandle = [];

var initialize = function(events){
for(var index = 0; index < events.length; index++){
if(eventsToHandle.indexOf(events[index]) == -1){
eventsToHandle.push(events[index]);
}
}
connect();
}

//call this to connect to the eventing hub and set up client-side receiving methods
var connect = function(){
cn = $.hubConnection('https://events.xxx.com/');
cn.logging = true;

hubProxy = cn.createHubProxy('eventHub');

//subscribe to all events currently indicated to be handled
for(var index = 0; index < eventsToHandle.length; index++){
listen(eventsToHandle[index]);
}

hubProxy.on('subscribed', function (model) {
console.log('Client subscribed to event hub: ' + model);
});

cn.qs = { "optiAuthToken" : authentication.getAuthToken() };
cn.start().done(function(){
//subscribe to events for this specific user
hubProxy.invoke('subscribe');
$rootScope.$broadcast('connectedToHub');
});
}


var listen = function(eventName){
hubProxy.on(eventName, function(model){
$rootScope.$broadcast(eventName, model);
});
}


上面 $rootScope.$broadcast(eventName, model);调用的接收方法是:

$scope.$on('controlActionUpdated', function (event, model) {
console.log('received controlActionUpdated message from event hub with model: controlActionId ' + model.controlActionId);
[further code omitted]


服务器:

此方法调用我们的缓存以获取executeingUserID的连接列表。如果找到至少一个,它将向该连接列表发送一条消息。

public async Task MyControlActionUpdated(ControlActionEventModel model, int executingUserID)
{
EventingConnectionDetails[] currentConnections = await cache.GetCurrentEventHubConnections(executingUserID);
if (currentConnections.Length > 0)
{
Trace.TraceInformation("event hub broadcasting control action updated to user {0} for control action {1} on connections {2}",
executingUserID, model.controlActionId, string.Join(", ", currentConnections.Select(c => c.ConnectionID).Distinct()));
Clients.Clients(currentConnections.Select(c => c.ConnectionID).Distinct().ToList()).controlActionUpdated(model);
}
else
{
Trace.TraceError("attempt to broadcast control action updated to user {0} for control action {1} failed due to no connections",
executingUserID, model.controlActionId);
}


}

我到处寻找其他人抱怨客户端缺少来自服务器的消息,但没有找到任何东西。有谁知道为什么从服务器发送来的消息未记录为在客户端收到的消息?

我正在使用通过服务总线背板托管在Azure中的Web角色中的SignalR 2.0。客户端是AngularJS 1.2.14版。

最佳答案

问题是由于我的配置错误导致服务总线底板实际上无法正常工作(我先在依赖解析器上调用UseServiceBus,然后将依赖解析器设置为DI的统一解析器)。

自我注意:在尝试深入研究之前,请先检查通过服务总线主题的流量。 :)

关于angularjs - SignalR 2-多个集线器实例时,客户端不会收到从服务器发送的所有消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22512446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com