Botframework 无法实现SqlBotDataStore

Botframework 无法实现SqlBotDataStore,botframework,Botframework,我已经为bot存储实现了SqlBotDataStore,但是LoadAsync方法正在悄无声息地失败。这是MessageController的帖子。任何地方都不会抛出异常,它只会停在这一行,聊天机器人会继续,就好像什么都没发生过一样,但存储不起作用: var botDataStore = scope.Resolve<IBotDataStore<BotData>>(); var key = Address.FromActivity(activity);

我已经为bot存储实现了SqlBotDataStore,但是LoadAsync方法正在悄无声息地失败。这是MessageController的帖子。任何地方都不会抛出异常,它只会停在这一行,聊天机器人会继续,就好像什么都没发生过一样,但存储不起作用:

    var botDataStore = scope.Resolve<IBotDataStore<BotData>>();
    var key = Address.FromActivity(activity);
    try
    {
        var userData = await botDataStore.LoadAsync(key, BotStoreType.BotPrivateConversationData, CancellationToken.None);
        userData.SetProperty<Translator>("translator", new Translator());
        userData.SetProperty<bool>("autoDetectLanguage", true);
        userData.SetProperty<bool>("autoTranslateToBot", true);
        userData.SetProperty<bool>("autoTranslateToUser", true);
        await botDataStore.SaveAsync(key, BotStoreType.BotPrivateConversationData, userData, CancellationToken.None);
    }
    catch (HttpException e)
    {
        Debug.WriteLine(e.Message);
    }
var botDataStore=scope.Resolve();
var key=地址。FromActivity(activity);
尝试
{
var userData=await botDataStore.LoadAsync(key,BotStoreType.BotPrivateConversationData,CancellationToken.None);
SetProperty(“translator”,new translator());
SetProperty(“autoDetectLanguage”,true);
SetProperty(“autoTranslateToBot”,true);
SetProperty(“autoTranslateToUser”,true);
等待botDataStore.SaveAsync(key,BotStoreType.BotPrivateConversationData,userData,CancellationToken.None);
}
catch(httpe异常)
{
Debug.WriteLine(e.Message);
}
我似乎无法克服这一点,不幸的是没有任何更多的信息,因为字面上没有错误或任何事情发生在这里。调试时,它永远不会转到下一行,而是以静默方式继续执行。

基于使用Azure Sql存储来存储bot状态,我使用以下更新修改了示例,并进行了测试,这对我来说很有效。您可以将示例与实现进行比较,以找出差异

在消息控制器中:

公共异步任务发布([FromBody]活动)
{
if(activity.Type==ActivityTypes.Message)
{
如果(activity.Text==“savetest”)
{
var消息=活动作为IMessageActivity;
使用(var scope=DialogModule.BeginLifetimeScope(Conversation.Container,message))
{
var botDataStore=scope.Resolve();
var key=地址。FromActivity(activity);
尝试
{
var userData=await botDataStore.LoadAsync(key,BotStoreType.BotPrivateConversationData,CancellationToken.None);
//SetProperty(“translator”,new translator());
SetProperty(“autoDetectLanguage”,true);
SetProperty(“autoTranslateToBot”,true);
SetProperty(“autoTranslateToUser”,true);
等待botDataStore.SaveAsync(key,BotStoreType.BotPrivateConversationData,userData,CancellationToken.None);
等待botDataStore.FlushAsync(key,CancellationToken.None);
}
catch(httpe异常)
{
Debug.WriteLine(e.Message);
}
}
}
wait Conversation.sendaync(活动,()=>newdialogs.EchoDialog());
}
其他的
{
HandleSystemMessage(活动);
}
var response=Request.CreateResponse(HttpStatusCode.OK);
返回响应;
} 
在EchoDialog中:

var tval=context.PrivateConversationData.GetValueOrDefault(“autoTranslateToBot”,false);
wait context.PostAsync(“您说:“+message.Text+$”,autoTranslateToBot是{tval.ToString()}”);
Wait(MessageReceivedAsync);
测试结果:


在SaveAsync之后添加FlushAsync调用:
等待botDataStore.FlushAsync(key,CancellationToken.None)它永远无法保存。加载异步后,处理停止。我只是将这段代码从MessageController中移出,并仅在根对话框中处理它,它似乎可以工作。我仍然不知道为什么/如何出现故障,停止处理,但在任何地方都没有异常或指示发生了什么。谢谢。我想我找到了我的问题所在。我不是在消息活动中执行此代码,而是在将用户添加到对话中时在更新用户活动中执行此代码。我想以默认值作为true开始。这似乎不起作用,因为我认为bot数据尚未存储,因此数据库中不存在密钥。我仍然很困惑,为什么它在没有任何通知的情况下失败,而尝试捕获什么都不做。这就是为什么发布所有问题的详细信息和代码会很好,因为这里的问题是特定于您如何实现它的
public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
{
    if (activity.Type == ActivityTypes.Message)
    {
        if (activity.Text == "savetest")
        {
            var message = activity as IMessageActivity;

            using (var scope = DialogModule.BeginLifetimeScope(Conversation.Container, message))
            {
                var botDataStore = scope.Resolve<IBotDataStore<BotData>>();

                var key = Address.FromActivity(activity);

                try
                {
                    var userData = await botDataStore.LoadAsync(key, BotStoreType.BotPrivateConversationData, CancellationToken.None);
                    //userData.SetProperty<Translator>("translator", new Translator());
                    userData.SetProperty<bool>("autoDetectLanguage", true);
                    userData.SetProperty<bool>("autoTranslateToBot", true);
                    userData.SetProperty<bool>("autoTranslateToUser", true);
                    await botDataStore.SaveAsync(key, BotStoreType.BotPrivateConversationData, userData, CancellationToken.None);
                    await botDataStore.FlushAsync(key, CancellationToken.None);
                }
                catch (HttpException e)
                {
                    Debug.WriteLine(e.Message);
                }
            }

        }

        await Conversation.SendAsync(activity, () => new Dialogs.EchoDialog());               
    }
    else
    {
        HandleSystemMessage(activity);
    }
    var response = Request.CreateResponse(HttpStatusCode.OK);
    return response;
} 
var tval = context.PrivateConversationData.GetValueOrDefault<bool>("autoTranslateToBot", false);

await context.PostAsync("You said: " + message.Text + $"; autoTranslateToBot is {tval.ToString()}");
context.Wait(MessageReceivedAsync);