2017-09-06 112 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

相關問題