【问题标题】:Send a message to the same conversation on emulator with Bot Framework使用 Bot Framework 向模拟器上的同一对话发送消息
【发布时间】:2016-09-24 13:47:09
【问题描述】:

我正在尝试在同一对话中从机器人向模拟器上的用户发送消息,但使用文档中的代码,它只会创建一个新对话,当我使用相同的对话 ID 时,它也会创建一个新的并且没有回复相同的对话。此代码创建一个新对话

             var userAccount = new ChannelAccount(name: "User1", id: "@2c1c7fa3");
            var botAccount = new ChannelAccount(name: "Conv1", id: "8a684db8");
            var connector = new ConnectorClient(new Uri("http://localhost:9000/"));
            var conversationId = await connector.Conversations.CreateDirectConversationAsync(botAccount, userAccount);
            IMessageActivity message = Activity.CreateMessageActivity();
            message.From = botAccount;
            message.Recipient = userAccount;
            message.Conversation = new ConversationAccount(id: conversationId.Id);
            message.Text = "Hello";
            message.Locale = "en-Us";
            await connector.Conversations.SendToConversationAsync((Activity)message);

如果我从用户发送的消息中使用相同的对话 ID,它也会创建一个新对话。像这样

  IMessageActivity message = Activity.CreateMessageActivity();
            message.From = botAccount;
            message.Recipient = userAccount;
            message.Conversation = new ConversationAccount(id: "Conv1");
            message.Text = "Hello";
            message.Locale = "en-Us";
            await connector.Conversations.SendToConversationAsync((Activity)message);

【问题讨论】:

    标签: c# botframework


    【解决方案1】:

    如果您在控制器中,并且想要回复用户,只需使用:

    var reply = activity.CreateReply();
    reply.Text = "Hello";
    await connector.Conversations.SendToConversationAsync(reply);
    

    如果你在一个对话框中,你仍然可以使用 activity.CreateReply() 但我会使用 context.PostAsync(reply) 而不是连接器。

    您无需创建对话即可回复用户发送的消息。

    【讨论】:

      【解决方案2】:

      例如,你可以在你的模拟器中看到这个json数据

      {
        "type": "message",
        "timestamp": "2016-12-02T07:39:33.8503472Z",
        "from": {
          "id": "56800324",
          "name": "Bot1"
        },
        "conversation": {
          "id": "8a684db8",
          "name": "Conv1"
        },
        "recipient": {
          "id": "2c1c7fa3",
          "name": "User1"
        },
        "text": "Sorry. I don't know what you are talking about...",
        "replyToId": "7cc6478627584aa497a209b4f284937e"
      }
      

      对话 ID 应为“8a684db8”,而不是“Conv1”。您可以在 POST 方法之外创建一个 SendMessage() 方法来发送消息(广告、事件、通知等),如下所示。

      private void SendMeesge(string msg)
      {
          var userAccount = new ChannelAccount(name: "User1", id: "2c1c7fa3");
          var botAccount = new ChannelAccount(name: "Bot1", id: 56800324);
          var connector = new ConnectorClient(new Uri("http://localhost:9000/"));
      
          // conversationId for Real Bot
          //var conversationId = connector.Conversations.CreateDirectConversationAsync(botAccount, userAccount).Result;
      
          // conversationId for Bot Emulator
          var conversationId = _activityHistory.Conversation;
      
          IMessageActivity message = Activity.CreateMessageActivity();
          message.From = botAccount;
          message.Recipient = userAccount;
          message.Conversation = new ConversationAccount(id: "8a684db8");
          message.Text = msg;
          message.Locale = "en-Us";
          connector.Conversations.SendToConversationAsync((Activity)message);
      }
      

      您必须为您的模拟器使用“8a684db8”,但对发布在 azure 上的 REAL BOT 使用“CreateDirectConversationAsync”。

      正如 Ezequiel 所说,如果你在 POST 方法中回复用户(在你的 bot 收到消息后),你就不需要走这种复杂的方式~

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-30
        • 1970-01-01
        • 1970-01-01
        • 2021-04-30
        相关资源
        最近更新 更多