2017-09-21 4 views
2

Ich habe ein Szenario, in dem ich den Kontext zu einem anderen Dialog mit Context.Forward weiterleiten und es funktioniert perfekt. Jetzt, wenn ich Code aktualisiere, um Dialogstapel zu holen und DialogStack.Forward zu verwenden, resultiert es in Stapel ist leere Ausnahme. Jeder Hinweis auf dieses Problem wird sehr geschätzt.DialogStack.Forward funktioniert nicht, wo in Context.Forward funktioniert

using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message)) 
{ 
var botData = scope.Resolve<IBotData>(); 
await botData.LoadAsync(default(CancellationToken)); 
var stack = scope.Resolve<IDialogStack>(); 

// DialogStack.Foward doesn't work 
await stack.Forward(new FeedbackDialog(FeedbackContext.CreateLead.ToString(), this.GetService<IResourceManager>()), this.ResumeAfterFeedbackDialog, context.Activity.AsMessageActivity(), CancellationToken.None); 
} 

// Context.Forward works 
await context.Forward(new FeedbackDialog(FeedbackContext.CreateLead.ToString(), this.GetService<IResourceManager>()), this.ResumeAfterFeedbackDialog, context.Activity.AsMessageActivity(), CancellationToken.None); 
+0

Wo/wann versuchst du, stack.Forward zu nennen? Warum nicht Kontext verwenden? Vorwärts? Bitte erläutern Sie etwas, was Sie zu tun versuchen. –

+0

In meinem Szenario habe ich einen Aufruf Aktivitätstyp, die ich separat behandeln muss, d. H. Außerhalb eines Dialogs Kontext. Am Ende möchte ich einen Dialog aufrufen, um noch ein paar mehr zu erledigen. Da ich die Aufrufaktivität außerhalb des Dialogkontexts behandle und für die letzte Operation ein Dialogfeld verwenden muss, muss ich entweder einen Kontext von irgendwo abrufen oder über DialogStack ausführen. – Ritesh

+0

Können Sie Conversation.SendAsync aufrufen (Nachricht,() => neu FeedbackDialog()); ? –

Antwort

1

ein Beispiel in der AlarmBot Probe ist, die etwas ähnliches tut:

https://github.com/Microsoft/BotBuilder/blob/master/CSharp/Samples/AlarmBot/Models/ExternalEvent.cs

Bitte versuchen Sie so etwas wie dieses:

Edit:

using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, activity)) 
{ 
    var token = new CancellationToken(); 
    var botData = scope.Resolve<IBotData>(); 
    await botData.LoadAsync(token); 
    var task = scope.Resolve<IDialogTask>(); 

    var child = new TestDialog();       
    var interruption = child.Do(new ResumeAfterCall().ResumeAfter); 

    try 
    { 
     task.Call(interruption, null); 
     await task.PollAsync(token); 
    } 
    finally 
    { 
     await botData.FlushAsync(token); 
    } 
} 

     [Serializable] 
     public class ResumeAfterCall 
     { 
      public async Task<IMessageActivity> ResumeAfter(IBotContext context, IAwaitable<object> result) 
      { 
       return await result as IMessageActivity;     
      } 
     } 
+0

Vielen Dank für Ihre Antwort Eric. Ich habe diese Probe schon gesehen. Dies hilft mir nicht viel, zuerst möchte ich Forward und zweitens die Fortsetzung nach der Methode als null angegeben, aber ich brauche einen Lebenslauf nach der hier angegebenen Methode. – Ritesh

+0

Ich habe meine Antwort bearbeitet, um eine ResumeAfter-Methode bereitstellen zu können. –

Verwandte Themen