2017-02-03 11 views
-2

Я занимаюсь ботом с Microsoft Bot Framework в C#, и у меня возникла проблема.PromptDialog не спрашивает в классе Dialog

Проблема заключается в том, что когда я вызываю «PromptDialog», чтобы получить строку от пользователя, в этом случае пароль не запрашивает ее, она открывает метод «Пароль» и сбой при попытке получить Строка.

Благодарим за помощь!

Класс расширяет LUISDialog

PromptDialog.Text(context, resume: Password, prompt: "Enter password:");

ЛУИС Намерение нуль:

[LuisIntent("")] 
    public async Task None(IDialogContext context, IAwaitable<IMessageActivity> activity, LuisResult result) 
    { 
     Boolean PassLogin; 
     Start(context, activity); //Does this need to be awaited? 
     if (!context.UserData.TryGetValue<Boolean>("PassLogin", out PassLogin)) PassLogin = false; 
     if (PassLogin) 
     { 
      var act = await activity; 
      if (act.Conversation.IsGroup != null && act.Conversation.IsGroup.Value) 
      { 
       context.Wait(MessageReceived); 
      } 
      else 
      { 
       await Nothing(context, activity, result); 
      } 
     } 
     else context.Wait(MessageReceived); 
    } 

Способ пуска. Метод Start вызывается каждым намерением от LUIS.

public async Task Start(IDialogContext context, IAwaitable<IMessageActivity> activity) 
    { 
     Boolean PassLogin, start; 
     if (!context.UserData.TryGetValue<Boolean>("PassLogin", out PassLogin)) 
     { 
      PassLogin = false; 
      context.UserData.SetValue<Boolean>("PassLogin", PassLogin); 
     } 
     if (!context.UserData.TryGetValue<Boolean>("start", out start)) 
     { 
      start = true; 
     } 
     if (start) 
     { 
      PromptDialog.Text(context, resume: Password, prompt: "Enter password:"); 
      await context.PostAsync("Something"); //This prints out before going to password. 
     } 
     await GetKey(context, activity); 
    } 

private async Task Password(IDialogContext context, IAwaitable<String> argument) 
    { 
     var response = await argument; 
     if (response=="test") 
     { 
      context.UserData.SetValue<Boolean>("PassLogin", true); 
      await context.PostAsync("Correct Password."); 
      if (context.UserData.Get<Boolean>("PassLogin")) 
      { 
       await context.PostAsync("Welcome"); 
       context.UserData.SetValue<Boolean>("start", false); 
      } 
     } 
     else 
     { 
      context.UserData.SetValue<Boolean>("PassLogin", false); 
      await context.PostAsync("Incorrect password."); 
     } 
     context.Wait(MessageReceived); //Does this need to be here? (Tried with and without.) 
    } 

Это то, что ошибка говорит:

Exception: Microsoft.Bot.Builder.Internals.Fibers.InvalidNextException: invalid next: Wait: Poll Object for ThunkStart.Rest have Object at Microsoft.Bot.Builder.Internals.Fibers.Fiber1.&lt;Microsoft-Bot-Builder-Internals-Fibers-IFiberLoop&lt;C&gt;-PollAsync&gt;d__13.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at Microsoft.Bot.Builder.Internals.Fibers.Wait2.Microsoft.Bot.Builder.Internals.Fibers.IAwaiter<T>.GetResult() at Microsoft.Bot.Builder.Dialogs.Chain.LoopDialog1.&lt;ResumeAsync&gt;d__3.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.Bot.Builder.Dialogs.Internals.DialogTask.ThunkResume1.<Rest>d4.MoveNext() — End of stack trace from previous location where exception was thrown — at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Bot.Builder.Internals.Fibers.Wait`2.<Microsoft-Bot-Builder-Internals-Fibers-IWait<C>-PollAsync>d19.MoveNext() — End of stack trace from previous location where exception was thrown — at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Bot.Builder.Internals.Fibers.Frame1.&lt;Microsoft-Bot-Builder-Internals-Fibers-IFrameLoop&lt;C&gt;-PollAsync&gt;d__7.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.Bot.Builder.Internals.Fibers.Fiber1.<Microsoft-Bot-Builder-Internals-Fibers-IFiberLoop<C>-PollAsync>d13.MoveNext() — End of stack trace from previous location where exception was thrown — at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Bot.Builder.Dialogs.Internals.DialogTask.<Microsoft-Bot-Builder-Dialogs-Internals-IDialogStack-PollAsync>d19.MoveNext() — End of stack trace from previous location where exception was thrown — at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Bot.Builder.Dialogs.Internals.DialogTask.<Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync>d21`1.MoveNext() — End of stack trace from previous location where exception was thrown — at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Bot.Builder.Dialogs.Internals.ReactiveDialogTask.<Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync>d31.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.Bot.Builder.Dialogs.Internals.ExceptionTranslationDialogTask.&lt;Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync&gt;d__21.MoveNext() — End of stack trace from previous location where exception was thrown — at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Bot.Builder.Dialogs.Internals.LocalizedDialogTask.<Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync>d21.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.Bot.Builder.Dialogs.Internals.ScoringDialogTask1.<Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync>d31.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.Bot.Builder.Dialogs.Internals.PersistentDialogTask.&lt;Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync&gt;d__31.MoveNext() — End of stack trace from previous location where exception was thrown — at Microsoft.Bot.Builder.Dialogs.Internals.PersistentDialogTask.<Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync>d3`1.MoveNext() — End of stack trace from previous location where exception was thrown — at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Bot.Builder.Dialogs.Internals.SerializingDialogTask.<Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync>d41.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.Bot.Builder.Dialogs.Internals.PostUnhandledExceptionToUserTask.&lt;Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync&gt;d__51.MoveNext() 
+0

Добавлены сведения об ошибке. – Saeru

+0

Можете ли вы также добавить метод, вызывающий PromptDialog.Text? Я думаю, что проблема есть. –

+0

Добавлен метод «Старт». – Saeru

ответ

0

Как я уже писал в комментариях, есть несколько вопросов, которые должны быть решены:

  1. вызов на Start должен быть найден
  2. Нельзя использовать код после звонка PromptDialog.Text. Этот код запускает новый диалог, который будет продолжаться в методе ResumeAfter после его завершения.
  3. Весь код после вызова Start, похоже, зависит от ResumeAfter запроса, поэтому его следует переместить туда.