Подключение клиента signalr к платформе bot framework

#signalr #botframework #signalr.client

#signalr #botframework #signalr.client

Вопрос:

У меня есть концентратор SignalR для живого агента, теперь я пытаюсь подключить свой фреймворк бота к концентратору SignalR. Для этого я выполнил настройку для клиента SignalR. Затем я указал подключение к концентратору в средстве доступа conversationstate. затем я могу установить соединение с концентратором signalr. но когда я пытаюсь получить доступ к подключению к концентратору доступа состояния, я получаю сообщение об ошибке: Не удается найти конструктор для использования для типа Microsoft.AspNetCore.SignalR.Клиент.Подключение к хабу. Класс должен либо иметь конструктор по умолчанию, один конструктор с аргументами, либо конструктор, помеченный атрибутом JsonConstructor. Путь ‘LiveAgentModel.connection.Время ожидания сервера истекло’.

это код для модели: «‘ публичный класс LiveAgentModel { public bool isConnected { get; set; } = false;

     public string agentConnectionId { get; set; }

    public string name { get; set; }

    public HubConnection connection;
}'''
  

именно к этому месту я пытаюсь получить доступ и получаю ошибку.

  public async Task OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken = default)
        {
            var conversationStateAccessors = _conversationState.CreateProperty<LiveAgentModel>(nameof(LiveAgentModel));
            var conversationData = await conversationStateAccessors.GetAsync(turnContext, () => new LiveAgentModel()).ConfigureAwait(false);
}
  

я получаю сообщение об ошибке после установки значения connection при попытке получить значение, как показано ниже

  private async Task Escalate(ITurnContext sendTurnContext, Activity handoffEvent)
        {

            var conversationStateAccessors = _conversationState.CreateProperty<LiveAgentModel>(nameof(LiveAgentModel));
            var conversationData = await conversationStateAccessors.GetAsync(sendTurnContext, () => new LiveAgentModel()).ConfigureAwait(false);

    

           conversationData.connection = new HubConnectionBuilder()
            .WithUrl("https://localhost:44348/ChatHub")
            .Build();
  

Пожалуйста, помогите мне в решении этой проблемы.

Ответ №1:

По-видимому, невозможно десериализовать объект HubConnection и повторно создать его, как только вы сохраните его в conversationState, я не знаю, лучший ли это способ сделать это, но это позволит вам сохранить ваш объект hubconnection в рабочем состоянии:

создайте класс, содержащий словарь, в котором вашим ключом будет «conversationId» вашего пользователя, а значением будет ваш объект HubConnection

1.- Создайте класс:

 public class MyDictionaryClass{
    //Initialize to prevent null exception
  public Dictionary<string, HubConnection> diccionaryConnections= new Dictionary<string, HubConnection>();
}
  

2.- Создайте одноэлементный сервис (словарь будет доступен всем пользователям и будет хранить данные lls во время работы приложения) в Startup.cs:

  services.AddSingleton<MyDictionaryClass>();
  

3.- Используйте сервис:

Мы должны использовать внедрение зависимостей… пример внутри диалогового окна внедрения зависимостей:

    public myDialog{
            MyDictionaryClass _myDictionaryService;
            
                //Constructor
                public myDialog(MyDictionaryClass myDictionaryService){
                _myDictionaryService = myDictionaryService;
                }
    
        
            }
  

4.- В класс MyDialog добавить метод

  public MyMethod(WaterfallStepContext stepContext, CancellationToken cancellationToken){
    
                 //check that the dictionary has a valid connection

                         if (_myDictionaryService.diccionaryConnections.ContainsKey(stepContext.Context.Activity.Conversation.Id)) {
                    
              //Dictionary has user connection... Make something 

 var connection = _myDictionaryService.diccionaryConnections[dialogContext.Context.Activity.Conversation.Id]

 await **conexion**.InvokeAsync("HubMethod", "Hello someone");
                                            }
                                            else {
                                            //the dictionary has no user connection... create connection to signalr
                       
                             var conexion =  new HubConnectionBuilder()
                                    .WithUrl("https://localhost:[MYPORT]/ServerHub")
                                    .Build();
                //Add to dictionary
                                    _myDictionaryService.diccionaryConnections.Add(conversationId, conexion);
            //Send message to HubServerMethod
            await conexion.InvokeAsync("HubMethod", "hi my frend");
                                     
    
           }
                    }
  

* Вам следует рассмотреть возможные пользовательские сценарии и события SignalRсобытий SignalR (подключено, переподключено, отключено и т.д.), Чтобы добавлять и удалять элементы из словаря, возможно, это решение позволит вам продолжить работу и исследование

* Важно, чтобы вы имели в виду, что одноэлементный словарь работает только во время работы приложения, и если вы найдете, как его улучшить, я хотел бы знать.