Comment gérer et stocker TurnState sans utiliser l'objet TurnContext

Oct 27 2020

Dans le morceau de code suivant, l'objet TurnContext est requis pour récupérer l'état du bot sous-jacent à partir de Cosmos et le sauvegarder -

//Get the TurnContext from the Dictionary
TurnContextReferences.TryGetValue(sessionStateChangedEventData.SessionId, out ITurnContext turnContext);
if (turnContext != null)
{
    var conversationData = await BotStateAccessors
                      .ConversationStateAccessor
                      .GetAsync(turnContext, () => new ConversationStateDataModel());
    if (!conversationData.LiveAgentChatClosed)
    {
        conversationData.LiveAgentChatClosed = true;
        await BotStateAccessors.ConversationStateAccessor.SetAsync(turnContext, conversationData);
        await BotConversationState.SaveChangesAsync(turnContext);
    }
}

Existe-t-il un moyen possible d'atteindre la même chose sans utiliser directement TurnContext?

Réponses

KyleDelaney Oct 28 2020 at 23:14

Toutes les informations dont vous avez besoin pour accéder à l'état du bot et envoyer des messages à un utilisateur se trouvent dans une référence de conversation. Vous pouvez créer un contexte de virage à partir d'une référence de conversation enregistrée à l'aide de la ContinueConversationAsyncméthode. Vous pouvez voir comment procéder dans l' exemple de messages proactifs :

await ((BotAdapter)_adapter).ContinueConversationAsync(_appId, conversationReference, BotCallback, default(CancellationToken));

Un contexte de tour n'est pas censé exister en dehors de son tour associé. Vous devriez enregistrer les références de conversation au lieu de tourner les contextes.