2017-01-16 2 views
0

Ich habe einen LuisDialog, der einen bestimmten Dialog aufruft, wenn eine Absicht gefunden wird. Dort rufe ich auf der Basis der extrahierten Entität einen weiteren Dialog auf, der eine unbehandelte Ausnahme zu werfen scheint. Hier ist die Absicht, in meiner Wurzel LuiDialog Aufruf BuyDialog (Ich bin die LuisResult für den späteren Gebrauch zu speichern) -Verketten mehrerer Dialoge mit 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); 
      } 
    } 

Hier ist meine BuyDialog ruft einen weiteren Dialog (BookDialog), wenn Einheit enthält „Buch“ 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 
    } 

Und hier ist mein 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); 
     } 

ich weiß, das Problem, dass die zweite context.call ist (der Anruf an bookDialog), denn wenn ich es den Code entfernen funktioniert einwandfrei. Im Moment bekomme ich "Entschuldigung, mein Bot-Code hat ein Problem", wenn er dort ankommt. Irgendeine Idee, was ist los?

Antwort

3

Die context.Done(true), die Sie im zweiten Dialog tun muss Pfad

Die 'Ist-Buch' in der BookDialogResumeAfter<T> Methode (BookFormComplete) sein sollte wie folgt aussieht: Durch

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

Dank ...! der Weg, gibt es eine Möglichkeit zu wissen, wo der Fehler durch Emulator selbst entstanden ist? Ich habe etwas über die Chain.DefaultIfException-Methode gelesen, um dies zu tun, aber ich weiß nicht, wie ich es implementieren soll. –

+1

Sehen Sie, ob dies nützlich ist https://docs.botframework.com/en-us/technical-faq/#look-for-exceptions. Bitte upvote die Antwort, wenn es nützlich war –

Verwandte Themen