【问题标题】:Embedding customized form flow bot in custom client在自定义客户端中嵌入自定义表单流机器人
【发布时间】:2018-03-19 16:24:18
【问题描述】:

我创建了一个自定义表单流。我将把它集成到我的自定义客户端中。为此,我在 Azure 门户中创建了一个表单模板机器人并发布了我更新的代码。

我不想使用默认聊天窗口,我想集成到我的自定义聊天窗口中。为此,我设置了一个直线通道。

这是我的代码:-

public string TalkToTheBot2(string paramMessage)
{
    DirectLineClient client = new DirectLineClient(DirectLineSecret);
    Conversation conversation = System.Web.HttpContext.Current.Session["conversation"] as Conversation;
    string watermark = System.Web.HttpContext.Current.Session["watermark"] as string;
    if (conversation == null)
    {
        conversation = client.Conversations.StartConversation();
    }
    Activity message = new Activity
    {
       Text = paramMessage,
       From = new ChannelAccount(),
       Type = ActivityTypes.Message
    };
    var result = client.Conversations.PostActivityAsync(conversation.ConversationId, message).Result;
    Chat objChat = ReadBotMessagesAsync(client, conversation.ConversationId, watermark);
    System.Web.HttpContext.Current.Session["conversation"] = conversation;
    System.Web.HttpContext.Current.Session["watermark"] = objChat.watermark;
    objChat.ChatMessage = paramMessage;
    return JsonConvert.SerializeObject(objChat);
}

private Chat ReadBotMessagesAsync(DirectLineClient client, string conversationId, string watermark)
{
    Chat objChat = new Chat();
    bool messageReceived = false;
    while (!messageReceived)
    {
        var activitySet = client.Conversations.GetActivitiesAsync(conversationId, watermark).Result;
        watermark = activitySet?.Watermark;
        var activities = from x in activitySet.Activities
                                 where x.From.Id == botId
                                 select x;
        foreach (Activity message in activities)
        {
          if (message.Text != null)
          {
              objChat.ChatResponse
                 += " "
                 + message.Text.Replace("\n\n", "<br />");
          }
          if (message.Attachments.Count > 0)
          {
              bjChat.ChatResponse
                  += " " + RenderImageHTML(message.Attachments[0].ContentUrl);
          }
        }
        messageReceived = true;
    }
     objChat.watermark = watermark;
     return objChat;
}

在我看来,我只是将来自用户的数据发布到此操作方法,然后将操作方法​​的响应返回给视图。 因为它是一个表单流机器人,所以很多问题将有多个选项,并且一些消息将带有附件。如何在此处管理这些选项和附件。

为了检测附件,我目前使用message.Attachments.Count

我不知道如何管理选项。

【问题讨论】:

    标签: c# botframework formflow


    【解决方案1】:

    为了检测附件,我目前使用的是 message.Attachments.Count。我不知道如何管理选项。

    我使用 SandwichOrder bot 进行测试(使用 FormFlow),我请求使用 Direct Line API 接收消息并检查响应,我发现选项包含在 buttons 归档和 ContentTypeapplication/vnd.microsoft.card.hero

    正如您所做的那样,您可以检测附件是否为空。要访问和提取选项,您可以检测ContentType 并从content 获取选项。

    我的测试中的示例响应:

    【讨论】:

    • 当我调用TalkToTheBot2("Hi") 然后ReadBotMessagesAsync 返回我在机器人中设置的聊天响应。但是在此之后如果我再次调用TalkToTheBot2("Hi"),那么它会返回null。
    • 请尝试使用fiddler抓取客户端库发给retrieve activities的请求并查看水印值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    相关资源
    最近更新 更多