Как говорится в заголовке, я ищу способ вызова 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
, и у меня все еще было бы единственное место для управления обработкой ошибок, но, кажется, стыдно не иметь возможности использовать адаптер шаблон только потому, что я использую диалоги.