Я пытаюсь отправить уведомления клиентам, которые подключились к SignalR Hub, на основе связанных событий, происходящих в Asterisk Сервер PBX VOIP с использованием AsterNet ARI.
Я могу получать события с помощью класса DeviceStateChangedEvent из AsterNet, используя обработчик событий, и хочу отправлять клиентам уведомления, связанные с изменениями состояния их устройств.
Кроме того, соединение SignalR также работает, и на веб-странице клиента отображается приветственное сообщение.
Но проблема заключается в том, что при отправке уведомления методом SendAsync вызывающему клиенту мой концентратор удаляется, и ниже возникает исключение:
System.ObjectDisposedException: 'Невозможно получить доступ к удаленному объекту. Имя объекта: «AgentHub».
Вот мой класс Hub, в котором я переопределил метод OnConnectedAsync () для отправки приветственного сообщения и установки обработчика событий для прослушивания событий с АТС.
public class AgentHub : Hub
{
public static AriClient ActionClient;
public override async Task OnConnectedAsync()
{
ActionClient = new AriClient(
new StasisEndpoint("voipserver", port, "username", "password"),
"HelloWorld",
true);
ActionClient.Connect();
ActionClient.OnDeviceStateChangedEvent += new DeviceStateChangedEventHandler(async delegate (IAriClient sender, DeviceStateChangedEvent e)
{
var notification = new DeviceStateChangeNotification
{
NotificationText = e.Device_state.Name + "'s state changed to " + e.Device_state.State,
SentAt = DateTime.Now.ToString()
};
await Clients.Caller.SendAsync(
"ReceiveNotification",
notification.NotificationText,
notification.SentAt
);
});
var notification = new DeviceStateChangeNotification
{
NotificationText = "Welcome!",
SentAt = DateTime.Now.ToString()
};
await Clients.Caller.SendAsync(
"ReceiveNotification",
notification.NotificationText,
notification.SentAt
);
await base.OnConnectedAsync();
}
}
ActionClient
, потому что он статичен.OnConnectedAsyc
вызывается для каждого пользователя, который подключается, и, посколькуActionClient
статичен, он будет перезаписываться каждый раз. Вероятно, у вас должен быть единственный обработчик событий, возможно, подписанный в конструкторе вашего концентратора, и отправка обработчика вClients.All
. - person Jeff Shepler   schedule 24.01.2020