BotFramework:PrivateConversationData或UserData变空

时间:2017-04-12 13:54:17

标签: c# azure botframework

MessagesController.cs中,以下代码在Post方法中执行,

if (activity.Text.ToLowerInvariant().StartsWith("code:"))
{
    var stateClient = activity.GetStateClient();
    var botData = await stateClient.BotState.GetUserDataAsync(activity.ChannelId, activity.From.Id);
    var token = botData.GetProperty<string>("AccessToken");

    BotUserModel botUser = CreateNewUser(token);

    var privateData = await stateClient.BotState.GetPrivateConversationDataAsync(activity.ChannelId, activity.Conversation.Id, activity.From.Id);
    privateData.SetProperty<BotUserModel>("botUser", botUser);
}
else 
{
     await Conversation.SendAsync(activity, () => new LuisDialog());
}

这会将botUser保存到 PrivateConversationData 字典

在LUIS对话框中,

[LuisIntent("DoSomething")]
public async Task DoSomething(IDialogContext context, LuisResult result)
{
    BotUserModel botUser;
    context.PrivateConversationData.TryGetValue<BotUserModel>("botUser", out botUser);             

   // Just to test
   context.PrivateConversationData.SetValue<BotUserModel>("TestValue", new BotUserModel());
}

在这里,我遇到异常 KeyNotFoundException:botUser

BotUserModel标记为[Serializable]并且具有很少的公共属性 - 全部都带有get / set。我检查了IBotBag(即PrivateConversationData)及其空

 [LuisIntent("DoSomethingNew")]
 public async Task DoSomethingNew(IDialogContext context, LuisResult result)
 {
      // Assuming DoSomething intent is invoked first        
      BotUserModel botUser;
      context.PrivateConversationData.TryGetValue<BotUserModel>("TestValue", out botUser);             
      // Here, no exception!
 }

现在,我在DoSomething方法中获取在LUIS对话框中设置的TestValue的值。

基本上,任何设置为LUIS Intent内的PrivateConversationData或UserData的数据都可以被其他LUIS意图访问;然而,在LUIS中无法访问MessageController.cs中的数据集(在调用LUIS之前)。

也尝试UserData

我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

您忘记将私有数据存储设置回状态客户端。这应该可以使它发挥作用。

var privateData = await stateClient.BotState.GetPrivateConversationDataAsync(activity.ChannelId, activity.Conversation.Id, activity.From.Id);
privateData.SetProperty<BotUserModel>("botUser", botUser);
await stateClient.BotState.SetPrivateConversationDataAsync(activity.ChannelId, activity.Conversation.Id, activity.From.Id, privateData);

查看州客户端上的documentation