C# 具有多个用户的Microsoft Bot Framework对话框

C# 具有多个用户的Microsoft Bot Framework对话框,c#,.net,botframework,C#,.net,Botframework,我正在使用Microsoft Bot Framework for.NET创建一个简单的问答机器人,作为ASP.NET MVC WebApi,用C#编写,主要用于多用户的空闲频道 我已经创建了一个对话框,我根据框架文档从消息控制器启动该对话框: await Conversation.SendAsync(activity, () => new QuestionDialog()); lambda表达式向Bot框架指示用于对话框的构造函数。QuestionDialog实现IDialog。启动对话

我正在使用Microsoft Bot Framework for.NET创建一个简单的问答机器人,作为ASP.NET MVC WebApi,用C#编写,主要用于多用户的空闲频道

我已经创建了一个对话框,我根据框架文档从消息控制器启动该对话框:

await Conversation.SendAsync(activity, () => new QuestionDialog());
lambda表达式向Bot框架指示用于对话框的构造函数。QuestionDialog实现IDialog。启动对话后,对话类被序列化并存储在Bot连接器云中,保存当前问题和预期答案,然后在当前对话中收到新消息时反序列化

我希望任何用户都能够回答机器人提出的随机问题,无论是哪个用户发起了对话,但似乎为每个与机器人交互的用户创建了一个新的问题对话框,因此只有发起问题的用户才能回答


有没有办法创建一个只与对话/频道绑定的对话框,而不是对话/频道和用户的组合?以这种方式尝试使用对话框有意义吗?

我想实现这一点的方法是:

  • 分别存储每个频道的状态(最新问题)。例如,创建一个可序列化的类“QuestionState”,它至少具有以下属性:服务URL、会话帐户ID和问题本身
  • 对于每个传入的活动(消息),检查发送者的服务URL和会话帐户ID,并将其与您的状态列表进行比较。如果找到匹配项,请根据最新问题评估消息(答案)。如果没有匹配项,这是一个没有先前状态的通道,因此您需要创建一个通道并询问第一个问题
  • 是一个方便的服务,以存储状态。当然,你可以使用任何你喜欢的服务。请记住,内存状态存储仅用于测试


    此外,对于此解决方案,您根本不必使用对话框-您可以在MessagesController中执行所有需要执行的操作。

    我想实现此功能的方法是:

  • 分别存储每个频道的状态(最新问题)。例如,创建一个可序列化的类“QuestionState”,它至少具有以下属性:服务URL、会话帐户ID和问题本身
  • 对于每个传入的活动(消息),检查发送者的服务URL和会话帐户ID,并将其与您的状态列表进行比较。如果找到匹配项,请根据最新问题评估消息(答案)。如果没有匹配项,这是一个没有先前状态的通道,因此您需要创建一个通道并询问第一个问题
  • 是一个方便的服务,以存储状态。当然,你可以使用任何你喜欢的服务。请记住,内存状态存储仅用于测试


    此外,对于此解决方案,您根本不必使用对话框-您可以在MessagesController中执行所有需要执行的操作。

    您可以使用update\u id更新发送给用户的每条消息。您是否尝试过?我的意思是,如果有人回答问题,请使用他们存储的更新id为每个用户更新发送的问题消息。您能给出一个您想要实现的组对话的脚本示例吗?@SergeyL只是想澄清一下,我是用C写的。。。我为这个问题添加了更多细节。在以用户身份进行的群聊中,您可以看到机器人提出的最后一个问题。您可以决定回答或键入与此无关的内容,例如笑话。机器人无法识别它。至于Slack,据我记忆所及,您可以在组中的每条消息上获得通知(对于其他平台来说不是这样),因此您可以在一些限制条件下实现您想要的功能。询问问题时,将有关问题的信息存储在对话数据存储中。然后所有的下一个消息(来自组),你可以认为是问题的答案。您可能会从用户那里得到问题的多个答案。您可以使用update_id更新发送给用户的每条消息。您是否尝试过这样做?我的意思是,如果有人回答问题,请使用他们存储的更新id为每个用户更新发送的问题消息。您能给出一个您想要实现的组对话的脚本示例吗?@SergeyL只是想澄清一下,我是用C写的。。。我为这个问题添加了更多细节。在以用户身份进行的群聊中,您可以看到机器人提出的最后一个问题。您可以决定回答或键入与此无关的内容,例如笑话。机器人无法识别它。至于Slack,据我记忆所及,您可以在组中的每条消息上获得通知(对于其他平台来说不是这样),因此您可以在一些限制条件下实现您想要的功能。询问问题时,将有关问题的信息存储在对话数据存储中。然后所有的下一个消息(来自组),你可以认为是问题的答案。您可能会从用户那里得到该问题的多个答案。