2016-12-20 12 views
2

以下はコードブロック全体です。基本的にformflowです。データをbotStateに保存しようとしています。MS BotFrameworkデータ保存、BotState

public class ProfileForm 
{ 
    // these are the fields that will hold the data 
    // we will gather with the form 
    [Prompt("What is your first name? {||}")] 
    public string FirstName; 

    [Prompt("What is your last name? {||}")] 
    public string LastName; 

    [Prompt("What is your gender? {||}")] 
    public Gender Gender; 

    // This method 'builds' the form 
    // This method will be called by code we will place 
    // in the MakeRootDialog method of the MessagesControlller.cs file 

    public static IForm<ProfileForm> BuildForm() 
    { 
     return new FormBuilder<ProfileForm>() 

       .Message("Please complete your profile!") 
       .OnCompletion(async (context, profileForm) => 

       { 
        BotData bt = new BotData(); 

        await context.PostAsync("Your profile is complete.\n\n"+profileForm.FirstName+profileForm.LastName+profileForm.Gender); 

        SessionInfo.botUserData.SetProperty<bool>("ProfileComplete", true); 
        SessionInfo.botUserData.SetProperty<string>("FirstName", profileForm.FirstName); 
        SessionInfo.botUserData.SetProperty<string>("LastName", profileForm.LastName); 
        SessionInfo.botUserData.SetProperty<string>("Gender", profileForm.Gender==Gender.Male? "Male" :"Female"); 

        await context.PostAsync("Before Saving"); 

        await SessionInfo.userStateClient.BotState.SetPrivateConversationDataWithHttpMessagesAsync(
         SessionInfo.ChannelID, SessionInfo.ConversationID, SessionInfo.FromID, SessionInfo.botUserData); 
        // Tell the user that the form is complete 
        await context.PostAsync("Your profile is complete."); 

       }) 
       .Build(); 
    } 
} 
// This enum provides the possible values for the 
// Gender property in the ProfileForm class 
// Notice we start the options at 1 
[Serializable] 

public enum Gender 

{ 

    Male = 1, Female = 2 

}; 

私はラインSetPrivateConversationDataWithHttpMessagesAsync()メソッドの呼び出しで、次のエラーを持っている、助けてください。


オブジェクト参照がオブジェクトのインスタンスに設定されていません。

と Microsoft.Bot.Builder.FormFlow.FormDialog1。 <は---例外がスローされた--- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw(で) System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccessで、前の場所からスタックトレースの終わりを> d__14.MoveNext() をMessageReceived Microsoft.Bot.Builder.Dialogs.Internals.DialogTask.ThunkResume1.d4.MoveNext() で System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)で、(タスク タスク) - 以前からスタックトレースの終わり例外がスローされた場所 - System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()の にSystem.Runtime.CompilerServices.TaskAwaiter.Throの終わり - 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.ExceptionServices.ExceptionDispatchInfo.Throw() 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__9.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 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>d16.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&lt;T&gt;.GetResult() at Microsoft.Bot.Builder.Dialogs.Chain.FromDialog1.<ResumeAsync>d3.MoveNext() — End of stack trace from previous location where exception was thrown — at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Bot.Builder.Dialogs.Internals.DialogTask.ThunkResume1.&lt;Rest&gt;d__4.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Bot.Builder.Internals.Fibers.Wait2.<Microsoft-Bot-Builder-Internals-Fibers-IWait<C>-PollAsync>d19.MoveNext() — End of stack trace from previous location where exception was thrown — at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Bot.Builder.Internals.Fibers.Frame 1-PollAsync> d9.MoveNext() で System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)でwForNonSuccess(タスク タスク) System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccessでSystem.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()(タスク タスク)で System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotificationで - 例外が をスローされた以前の場所からスタックトレース(タスク タスク) でMicrosoft.Bot.Builder.Internals.Fibers.Fiber1。 <マイクロソフト-ボットビルダー-の内部-繊維-IFiberLoop <C> -PollAsync > d__16.MoveNext() ---例外がスローされた以前の位置からスタックトレースの終わり--- System.Runtime.ExceptionServices.ExceptionDispatchInfoで.Throw()で Microsoft.Bot.Builder.Internals.Fibers.Wait2.Microsoft.Bot.Builder.Internals.Fibers.IAwaiter.GetResult() at Microsoft.Bot.Builder.Dialogs.Chain.LoopDialog1。 <ResumeAsync> d__3.MoveNext() ---例外がスローされた--- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw(で) System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccessで、前の場所からスタックトレースの終わり Microsoft.Bot.Builder.Dialogs.Internals.DialogTask.ThunkResume1.d4.MoveNext() で System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)で、(タスク タスク) - 以前からスタックトレースの終わり例外がスローされた場所 - System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()のとき System.Runtime.CompilerServices.TaskAwaiter.ThrowForN 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.ExceptionServices.ExceptionDispatchInfo.Throw() 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__9.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 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>d16.MoveNext() — End of stack trace from previous location where exception was thrown — at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 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>d20.MoveNext() — End of stack trace from previous location where exception was thrown — at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 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>d22 1で System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)にするonSuccess(タスク タスク)。MoveNextメソッド() - System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccessでSystem.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()(タスク タスク)で システムで - 例外が をスローされた以前の位置からのスタックトレースの終わり。 Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク) Microsoft.Bot.Builder.Dialogs.Internals.ReactiveDialogTask.d31.MoveNext() ---例外がスローされた前の場所からのスタックトレースの終了--- にあるSystem.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()のSystem.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク) Microsoft.Bot.Builder.Dialogs.Internals.ScoringDialogTask1.d3 1.MoveNext() — End of stack trace from previous location where exception was thrown — at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.Bot.Builder.Dialogs.Internals.PersistentDialogTask.<Microsoft-Bot-Builder-Dialogs-Internals-IPostToBot-PostAsync>d31.MoveNext() --- End of stack trace from previous location where exception was thrown --- 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 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 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>d4 1.MoveNext() でSystem.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク) - スタックトレースの終わり例外が をスローされた以前の位置から - Microsoft.Botで System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotificationでSystem.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccessでSystem.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()(タスク タスク)(タスク タスク)で.Builder.Dialogs.Internals.ExceptionTranslationDialogTask.d21.MoveNext() ---以前の位置からのスタックトレースの終点exc eptionがスローされました--- System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw(で) System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク)で System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスクで)で Microsoft.Bot.Builder.Dialogs.Internals.LocalizedDialogTask。 <マイクロソフト・ボット・ビルダー・ダイアログ-の内部-IPostToBot-PostAsync > d__21.MoveNext() - System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()で システムで - 例外が をスローされた以前の位置からのスタックトレースの終わり Microsoft.Bot.Builder.Dialogs.Internals.PostUnhandledExceptionToUserTask.d5`1.MoveNextでSystem.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotificationで.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク)(タスク タスク)() - 例外がスローされた前の場所からのスタックトレースの末尾 - でMicrosoft.Bot.Builder.Dialogs.Internals.PostUnhandledExcep () ---例外がスローされた前の場所からのスタックトレースの末尾--- でSystem.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() にSystem.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccessタスク タスク)で System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク)で Microsoft.Bot.Builder.Dialogs.Internals.LogPostToBot。 <マイクロソフト・ボット・ビルダー・ダイアログ-の内部-IPostToBot-PostAsync > d__31.MoveNext() - System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()で システムで - 例外が をスローされた以前の位置からのスタックトレースの終わり Microsoft.Bot.Builder.Dialogs.Conversation.d4でSystem.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotificationで.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク)(タスク タスク)。MoveNextメソッド() - 例外がスローされた以前の場所からのスタックトレースの終わり - System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throwで () System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(タスク タスク)で システムで。 をSystem.Runtime.ExceptionServicesで - 例外がスローされた以前の位置からスタックトレースの終わり - Microsoft.Bot.Builder.Dialogs.Conversation.d2.MoveNext()でRuntime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(タスク タスク) .ExceptionDispatchInfo.Throw()at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess( タスク) Syst em.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification LUISBotAppTesting.MessagesController.d__1.MoveNextでSystem.Runtime.CompilerServices.TaskAwaiter.ValidateEndで(タスク タスク)(タスク タスクが)()

+0

あなたが関与して全体のコードを公開していない場合は、ここで何が起こっているかを知ることは本当に難しいです。 –

+0

私はコードブロック全体を更新しました。基本的にはフォームフロー内にあり、ボット状態でデータを保存しようとしています。具体的には、Facebook Messengerからこのコードを使用しています。 –

答えて

0

それは少し難しいです問題を理解するために、私は言及したいと思いますが、その関数botUserData.SetProperty<>()は現在のオブジェクトのプロパティを編集するだけのプロパティを保存しません。 BotState.SetUserData()を使用し、オブジェクトを渡してオブジェクトを保存する必要があります。ここ
は、ボットの状態を保存する作業例です:

public static bool saveData(Activity activity, string key, string value) 
{ 
    StateClient stateClient = activity.GetStateClient(); 
    BotData userData = stateClient.BotState.GetUserData(activity.ChannelId, activity.From.Id); 
    userData.SetProperty<string>(key, value); 
    BotData updateResponse = stateClient.BotState.SetUserData(activity.ChannelId, activity.From.Id, userData); 
    return value == updateResponse.GetProperty<string>(key); 
} 
関連する問題