2017-01-16 3 views
0

У меня есть LuisDialog, который вызывает конкретный диалог, если намерение найдено. Там, на основе выделенного объекта, я вызываю еще один диалог, который, кажется, бросает какое-то необработанное исключение. Вот цель в моей корневой LuiDialog вызывающего BuyDialog (я спасая LuisResult для последующего использования) -Цепочка нескольких диалогов с использованием context.call/done

[LuisIntent("Buy")] 
public async Task Buy(IDialogContext context, LuisResult result) 
{ 
    var cts = new CancellationTokenSource(); 
    await context.PostAsync("you want to buy"); 
    context.PrivateConversationData.SetValue<LuisResult>("luis", result); 
    context.Call(new BuyDialog(), ResumeAfterBuyDialog); 
} 
private async Task ResumeAfterBuyDialog(IDialogContext context, IAwaitable<bool> result) 
    { 
     var success = await result; 
     if (success) 
     { 
      await context.PostAsync("How else can I help you?"); 
      context.Wait(MessageReceived); 
      } 
    } 

Вот мой BuyDialog вызова другого диалога (BookDialog), если объект содержит «книгу» string-

else if(is_book) 
       { 
        await context.PostAsync("You selected book category"); 
        context.Call(new BookDialog(),BookFormComplete); 
        context.Done(true); 
       } 
private async Task BookFormComplete(IDialogContext context, IAwaitable<bool> result) 
    { 
     var BookResult = await result; 
     //do something if result is true 
    } 

А вот мой BookDialog-

[Serializable] 
public class BookDialog : IDialog<object> 
{ 
    public async Task StartAsync(IDialogContext context) 
    { 
     context.Wait(MessageReceivedAsync); 
    } 
    public async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> argument) 
    { 
     var message = await argument; 
     if (message.Text == "mtl100") 
     { 
      await context.PostAsync("Correct"); 
      context.Done(true); 
     } 
     else 
     { 
      await context.PostAsync("Please enter valid course code"); 
      context.Wait(MessageReceivedAsync); 
     } 

Я знаю, что проблема заключается в том, что второй context.call (призыв к bookDialog), потому что если я удалить его код работает отлично. Прямо сейчас, я получаю «извините, мой бот-код имеет проблему», когда он добирается до него. Любая идея, что не так?

ответ

3

context.Done(true), что вы делаете во втором диалоге должно быть в методе BookDialogResumeAfter<T> (BookFormComplete)

«Есть книга» Путь должен выглядеть так:!

else if(is_book) 
{ 
    await context.PostAsync("You selected book category"); 
    context.Call(new BookDialog(),BookFormComplete); 
} 
+0

Спасибо ... По способ, есть ли способ узнать, где ошибка возникла через сам эмулятор? Я прочитал что-то о методе Chain.DefaultIfException, но я не знаю, как его реализовать. –

+1

Посмотрите, полезно ли это https://docs.botframework.com/en-us/technical-faq/#look-for-exceptions. Пожалуйста, поддержите ответ, если он был полезен –

Смежные вопросы