2017-07-10 15 views
1

を継続するのではなく、呼び出します私は、ユーザーがダイアログに戻り、現在のダイアログに

[Serializable] 
public class ModifyLicenceDialog: IDialog<object> 
{ 
    private const string CreateLicence = "Create a new licence"; 
    private const string ModifyEndDate = "Modify end date"; 
    private const string CancelLicence = "Cancel a licence"; 

    public async Task StartAsync(IDialogContext context) 
    { 
     if (!CommonConversation.User.IsAuthorized) 
     { 
      context.Call(new AuthDialog(), ResumeAfterAuth); 
     } 
    } 

    private async Task ResumeAfterAuth(IDialogContext context, IAwaitable<object> result) 
    { 
     await result; 
     PromptDialog.Choice(context, ResumeAfterChoice, new[] { CreateLicence, ModifyEndDate, CancelLicence }, 
      "What licence function would you like?", 
      "I am sorry i did not understand that, please select one of the below options"); 
    } 

    private async Task ResumeAfterChoice(IDialogContext context, IAwaitable<string> result) 
    { 
     string selected = await result; 

     switch (selected) 
     { 
      case CreateLicence: 
       context.Call(new CreateLicenseDialog(), AfterLicenseDialog(CreateLicence)); 
       break; 
      case ModifyEndDate: 
       break; 
      case CancelLicence: 
       break; 

     } 
    } 

    private ResumeAfter<object> AfterLicenseDialog(IDialogContext context, string licenseEvent) 
    { 
     switch (licenseEvent) 
     { 
      case CancelLicence: 
       await context.PostAsync("Auth done"); 
       context.Done(licenseEvent); 
       break; 

     } 
    } 

が存在することを確認するためにボット機能の残りの部分に進む前に、ユーザーを認証し、このコードを持ってしようとしていますしかし、私のコードがAuthDialogに入って、提供された電子メールを持つユーザが存在する場合(specifically at res = await client.GetAsync(uri))、apiが結果を返すと、ボットは親ダイアログ(ModifyLicenceDialog)に戻り、ResumeAfterAuthを実行します。

[Serializable] 
    public class AuthDialog: IDialog<object> 
    { 
     private const string InputEmail = "Please input your email address to continue."; 
     private int _attempts = 3; 

     public async Task StartAsync(IDialogContext context) 
     { 
      await context.PostAsync(InputEmail); 
      context.Wait(MessageReceivedAsync); 
     } 

     private async Task MessageReceivedAsync(IDialogContext context, IAwaitable<IMessageActivity> result) 
     { 
      IMessageActivity activity = await result; 
      string email = activity.Text; 

      await context.PostAsync("Please wait while we verify this..."); 

      HttpResponseMessage res = new HttpResponseMessage(); 
      HttpClient client = AuthFunctions.Client; 

      string uri = $"api/v1/auth/licenses/{email}"; 

      res = await client.GetAsync(uri); 

      if (res.IsSuccessStatusCode) 
      { 
       CommonConversation.User = JsonConvert.DeserializeObject<CustomerUser>(await res.Content.ReadAsStringAsync()); 
       await context.PostAsync($"Welcome {CommonConversation.User.FirstName}!"); 
       context.Done(email); 
      } 
      else if (_attempts > 0) 
      { 
       _attempts--; 

       await context.PostAsync("I am sorry we do not recognize that email address, lets try again. Please input your email address"); 
       context.Wait(MessageReceivedAsync); 
      } 
      else 
      { 
       context.Fail(new Exception("I am afraid you are not an authorized user")); 
      } 
     } 



    } 
} 

更新ニコラスRからいくつかのガイダンスの後に、それはその時点で例外がスローされ

{"Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host."} 
" at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()\r\n at SupportHelpdeskBot.Dialogs.AuthDialog.<MessageReceivedAsync>d__3.MoveNext() in C:\\Workspace\\SupportBot\\SupportHelpdeskBot\\SupportHelpdeskBot\\Dialogs\\AuthDialog.cs:line 41" 

を次のように 例外があることを私が起きてからこれを停止するためにSystem.Net.ServicePointManager.Expect100Continue = false;を試みたが、このhasnt作業いかなるsuggesitonsいる?判明

+0

Context.Call()の代わりにContext.Forward()を使ってみてください: 'await context.Forward(new PaymentDialog()、ResumeAfterPaymentDialog、context.Activity.AsMessageActivity()、CancellationToken.None); ' – JasonSowers

+0

あなたの応答のためにこんにちは、ありがとう、転送を使用した後今AuthDialog StartAsyncでも待機しません。 – Harry

+0

ショットを付けた価値がありました – JasonSowers

答えて

1

は、あなたの実装に誤りがない:あなたはcontext.Done(email)とここにあなたのAuthDialogを完了している:通常の振る舞いです

if (res.IsSuccessStatusCode) 
{ 
    CommonConversation.User = JsonConvert.DeserializeObject<CustomerUser>(await res.Content.ReadAsStringAsync()); 
    await context.PostAsync($"Welcome {CommonConversation.User.FirstName}!"); 
    context.Done(email); 
} 

。何を実装したいですか?私はあなたの質問が不完全だと思う。

+0

いいえ、ごめんなさい申し訳ありませんが、私の質問から明らかではないが、問題は決してコードのいずれかに到達していない場合は、res = await client.GetAsync(uri); if文を指すように要求が完了すると、親ダイアログに戻ります。 – Harry

+0

デバッグ中に「res」を追加しましたか?あなたはまた、あなたの 'ModifyLicenceDialog'のすべてのコードを入れてもよろしいですか? –

+0

はい、resは予想されるjsonオブジェクトの200応答を返します。私はもう一度ModifyLicenceDialogを更新していますが、私には1秒を返します。 – Harry

関連する問題