2017-09-06 52 views
2

在我的机器人内的对话,我存储在ConversationData的标志值,像这样:如何在对话框外部访问Bot Framework对话数据?

context.ConversationData.SetValue("SomeFlag", true); 

后来,我需要检查该标志在我MessagesController,之前的消息被分配到一个对话框。按照this previous question我试图通过StateClient检索ConversationData像这样:

public async Task<HttpResponseMessage> Post([FromBody] Activity incomingMessage) 
{ 
    StateClient stateClient = incomingMessage.GetStateClient(); 
    BotData userData = await stateClient.BotState.GetConversationDataAsync(message.ChannelId, message.Conversation.Id); 
    bool finishedQuote = userData.GetProperty<bool>("SomeFlag"); 
    //... 
    // do conditional logic, then dispatch to a dialog as normal 
} 

然而,在运行时,userData变量保存BotData对象,其中userData.Data是空的,我无法通过检索任何存储的标志GetProperty。我没有看到relevant documentation中的任何内容可以帮助解决这个问题 - 我在这里可能会做错什么?有什么我误解?

回答

2

以下应为你所需要的工作:

 if (activity.Type == ActivityTypes.Message) 
     { 

      var message = activity as IMessageActivity; 
      using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message)) 
      { 
       var botDataStore = scope.Resolve<IBotDataStore<BotData>>(); 
       var key = new AddressKey() 
       { 
        BotId = message.Recipient.Id, 
        ChannelId = message.ChannelId, 
        UserId = message.From.Id, 
        ConversationId = message.Conversation.Id, 
        ServiceUrl = message.ServiceUrl 
       }; 
       var userData = await botDataStore.LoadAsync(key, BotStoreType.BotUserData, CancellationToken.None); 

       userData.SetProperty("key 1", "value1"); 
       userData.SetProperty("key 2", "value2"); 

       await botDataStore.SaveAsync(key, BotStoreType.BotUserData, userData, CancellationToken.None); 
       await botDataStore.FlushAsync(key, CancellationToken.None); 
      } 
      await Conversation.SendAsync(activity,() => new Dialogs.RootDialog()); 
     } 

你将需要实现这个类或类似的东西:如下

public class AddressKey : IAddress 
{ 
    public string BotId { get; set; } 
    public string ChannelId { get; set; } 
    public string ConversationId { get; set; } 
    public string ServiceUrl { get; set; } 
    public string UserId { get; set; } 
} 
+0

谢谢,这是完美的!只是改变它加载ConversationData而不是UserData,它做到了我所需要的! –

+0

很高兴你得到它的工作 – JasonSowers

0

初始化BotState对象与StateClient。试试下面的代码

public static T GetStateData<T>(Activity activity, string key) 
    { 
     BotState botState = new BotState(activity.GetStateClient()); 
     BotData botData = botState.GetConversationData(activity.ChannelId, activity.Conversation.Id); 
     return botData.GetProperty<T>(key); 
    } 
+0

这没有奏效 - 它产生了与我的问题中发布的片段相同的结果。 –

+0

来测试它尝试harcoding“活动。ChannelId“转换为”网络聊天“,并在保存和检索时为对话提供任何固定值任何保存在ConversationData中的特定原因你也可以尝试UserData,PrivateConversationData等 – Satheesh

+0

我不使用网络聊天,我使用Bot Framework模拟器 - 我不认为加载UserData或PrivateConversationData会有什么不同,因为它们的加载方式是一样的,我很欣赏这个尝试,但是上面JasonSowers接受的解决方案完美地工作。 –

0

我已经尝试了这种方法:

var message = activity as IMessageActivity; 
using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message)) 
{ 
} 

但我有一个问题与此有关。我所做的是我在RootDialog中设置了conversationData

context.ConversationData.SetValue<string>("Flow", "Luis"); 

设置对话数据后。我喜欢在MessageActivityLogger

public class MessageActivityLogger : IActivityLogger 
{ 
} 

登录信息来访问我用这个代码

using (var scope = DialogModule.BeginLifetimeScope(Microsoft.Bot.Builder.Dialogs.Conversation.Container, message)) 
{ 
} 

但我第一次发送到客户端的响应conversationData,该conversationdata是空的。 当客户端发回响应时,设置了conversationData

我曾尝试之类的东西

context.ConversationData.SetValue<string>("Flow", "Luis"); 
await context.FlushAsync(CancellationToken.None); 
await context.LoadAsync(CancellationToken.None); 

但后来一些奇怪的事情在我的流程发生。我使用子图来工作。

我认为我的问题的原因是CachingBotDataProvider创建的新实例。数据不保存在SqldataBotProvider中。

但是,当我尝试更改我的CachingBotDataStore的注册方法时,它不起作用。

+0

这并不真正回答这个问题。不同的问题,你可以通过点击[Ask Question](问问题)(https://stackoverflow.com/questions/ask)来提问。你也可以[添加赏金](https://stackoverflow.com/help/privileges/set-赏金)画m一旦你拥有足够的[声望](https://stackoverflow.com/help/whats-reputation),请关注这个问题。 - [来自评论](/ review/low-quality-posts/18457414) – EJoshuaS

+0

如果您有新问题,请点击[Ask Question](问问题)(https://stackoverflow.com/questions/ask)按钮。如果有助于提供上下文,请包含此问题的链接。 - [来自评论](/ review/low-quality-posts/18457414) – user8371915

相关问题