Можно ли завершить текущий диалог (если есть активный) внутри OnTurnError - PullRequest
0 голосов
/ 17 июня 2019

Как говорится в заголовке, я ищу способ вызова dialogContext.EndDialogAsync() или dialogContext.CancelAllDialogsAsync() из метода OnTurnError, предоставленного внутри DefaultAdapter класса шаблона Virtual Assistant.

Я уже прочитал эту документацию , но это все об управлении диалогами в обычном потоке событий, а не об их обработке в состоянии ошибки.

Я обновил конструктор для класса DefaultAdapter, добавив UserState, ConversationState и DynamicWaterfallState, и вызываю соответствующие методы для очистки состояния. К сожалению, даже после того, как состояние очищено, диалоговое окно, которое выдало ошибку, все еще остается активным, так что пользователи все еще могут нажимать кнопки на карточках - после того, как диалоговое окно было завершено, можно нажимать кнопки, но обратная передача не кажется срабатывает.

Текущий код:

public DefaultAdapter(
    BotSettings settings,
    ICredentialProvider credentialProvider,
    IBotTelemetryClient telemetryClient,
    BotStateSet botStateSet,
    UserState userState,
    ConversationState conversationState,
    DynamicWaterfallState dynamicWaterfallState
)
    : base(credentialProvider)
{
    OnTurnError = async (turnContext, exception) =>
    {
        await turnContext.SendActivityAsync(new Activity(type: ActivityTypes.Trace, text: $"{exception.Message}"));
        await turnContext.SendActivityAsync(new Activity(type: ActivityTypes.Trace, text: $"{exception.StackTrace}"));
        await turnContext.SendActivityAsync(MainStrings.ERROR);

        telemetryClient.TrackException(exception);

        // Nuke the state
        botStateSet.BotStates.Clear();
        await botStateSet.SaveAllChangesAsync(turnContext, true);

        await userState.ClearStateAsync(turnContext);
        await userState.SaveChangesAsync(turnContext, true);

        await conversationState.ClearStateAsync(turnContext);
        await conversationState.SaveChangesAsync(turnContext);

        dynamicWaterfallState.ClearState();
    };

    Use(new TranscriptLoggerMiddleware(new AzureBlobTranscriptStore(settings.BlobStorage.ConnectionString, settings.BlobStorage.Container)));
    Use(new TelemetryLoggerMiddleware(telemetryClient, logPersonalInformation: true));
    Use(new ShowTypingMiddleware());
    Use(new SetLocaleMiddleware(settings.DefaultLocale ?? "en-us"));
    Use(new EventDebuggerMiddleware());
    Use(new AutoSaveStateMiddleware(botStateSet));
}

Я ищу общий способ сделать это, а не заключать весь мой код в диалоги в операторах try-catch.

Текущий способ DialogContext создается (в Bot Framework) означает, что он не приводит к внедрению зависимостей, потому что он опирается на значения времени выполнения согласно:

// In DialogBot.cs constructor
var dialogState = conversationState.CreateProperty<DialogState>(nameof(VirtualAssistant));
_dialogs = new DialogSet(dialogState);
_dialogs.Add(dialog);

// In DialogBot.cs OnTurnAsync
var dc = await _dialogs.CreateContextAsync(turnContext);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...