#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 (подключено, переподключено, отключено и т.д.), Чтобы добавлять и удалять элементы из словаря, возможно, это решение позволит вам продолжить работу и исследование
* Важно, чтобы вы имели в виду, что одноэлементный словарь работает только во время работы приложения, и если вы найдете, как его улучшить, я хотел бы знать.