在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
。
我错过了什么吗?
答案 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。