【问题标题】:Update already posted Adaptive Card in Bot Framework v4 in C#更新已在 C# 中的 Bot Framework v4 中发布自适应卡
【发布时间】:2020-01-25 19:19:42
【问题描述】:

我正在使用 C# 中的 Bot Framework v4 开发一个 Bot。我现在想要的是,在使用 Actions 向用户发送自适应卡片后,我可以在触发 Action 后更新这张卡片。 例如,点击后按钮会消失。

Link to NodeJS Solution

这里我在 NodeJS 中有一个解决方案,但我无法将它转移到 C#。 有人可以帮忙吗?

更多项目详情: 我有一张看起来像这样的自适应卡:

在我使用 SharePoint 库中的 MS Graph 进行搜索后,将生成此卡片。

主要目标是,我可以使用 Refiners 使用来自 JSON 的新卡来更新卡。 “确定”按钮是一个提交操作,可以在 OnMessageActivityAsync 方法中捕获。 输入值在活动值中,因此可以创建过滤方法。 我的问题是,我无法更新已发送给用户的卡片。

在我将第一张带有结果的卡片发送给用户之前,我将 Activity 写入一个状态,因此我可以访问 OnMessageActivityAsync 方法,但我不确定这是否是正确的方法。

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
    {
        Logger.LogInformation("Running dialog with Message Activity.");

        var txt = turnContext.Activity.Text;
        dynamic val = turnContext.Activity.Value;
        // Check if the activity came from a submit action
        if (string.IsNullOrEmpty(txt) && val != null)
        {
            await turnContext.SendActivityAsync(MessageFactory.Text($"Refiner Language: {val.id_language}"));
            await turnContext.SendActivityAsync(MessageFactory.Text($"Refiner MachType: {val.id_type}"));

            var r = new StreamReader("Cards/helloCard2.json");
            string json = r.ReadToEnd();
            AdaptiveCard card = AdaptiveCard.FromJson(json).Card;

            var docSearchState = await StateAccessor.GetAsync(turnContext);
            Activity activity = docSearchState.Activity;
            activity.Attachments = new List<Attachment>() {
                new Attachment()
                {
                    Name = "Card",
                    ContentType = AdaptiveCard.ContentType,
                    Content = card,
                }
            };

            await turnContext.UpdateActivityAsync(activity);
        }

此代码给我以下错误消息:

fail: Microsoft.Bot.Builder.Integration.AspNet.Core.BotFrameworkHttpAdapter[0]
  Exception caught : Error reading JArray from JsonReader. Current JsonReader item is not an array: StartObject. Path 'DocumentSearchState.Activity.attachments.$values[0].content.body'.

有没有人解决这个问题的好主意?

【问题讨论】:

  • 你应该开始做这个项目,然后在遇到障碍时寻求帮助,而不是把整个项目交给你。向我们展示您到目前为止所做的工作。
  • 你在使用 Teams 频道吗?
  • 目前我正在使用机器人模拟器进行测试。但最后我想使用团队频道。这不应该是特定于渠道的问题。我想。
  • 您正在尝试更新对话历史记录中的现有消息。这绝对是特定于渠道的功能。我的回答可以接受吗?

标签: c# botframework bots


【解决方案1】:

查看this answer,了解如何更新自适应卡片。

您可以编写代码从自适应卡片中动态删除提交操作,或者您可以拥有两种不同版本的卡片:一个带有提交操作,一个没有。

如果您希望使用可以安装在 NuGet 包中的预构建代码来简化整个过程,请随时在 GitHub 上表达您对这些想法的支持:

【讨论】:

    【解决方案2】:

    您可以在 MS Teams 等频道中更新自适应卡,而不是直接更新。 要更新卡片,您需要一个访问器来存储发送当前消息时生成的 ActivityId。

    var response = await stepContext.Context.SendActivityAsync(reply);
    //Customize object to store ID
    UserProfile user = new UserProfile(response.Id);
    //Accessor to store card values to update it and disable buttons after click
    await CardStateAccessor.SetAsync(stepContext.Context, user, cancellationToken);
    

    在下一个瀑布步骤之后,您需要编写逻辑来更新此发布的消息。

    UserProfile UserDataState = await CardStateAccessor.GetAsync(stepContext.Context, () => new UserProfile());
    //Retrive accessor property
    //Here I am updating adaptive card
    var reply = stepContext.Context.Activity.CreateReply();
                    string text = File.ReadAllText("./AdaptiveCards/UpdatedYesNo.json");
                    var cardObj = JsonConvert.DeserializeObject(text);
                    reply.Attachments = new List<Attachment>()
                    {
                        new Attachment(){ContentType="application/vnd.microsoft.card.adaptive",Content=cardObj}
                    };
                    //Here you need to assign ID from accessor so that earlier posted msg gets updated
                    reply.Id = UserDataState.ActivityId;
                    //Use here UpdateActivityAsync to post updated message
                    await stepContext.Context.UpdateActivityAsync(reply, cancellationToken);
    

    只是添加信息: 对我来说,目标是在点击后禁用自适应卡的按钮。 因此,当我第二次发布自适应卡片时,我只是从按钮中删除了所有操作。

    【讨论】:

      猜你喜欢
      • 2020-12-10
      • 1970-01-01
      • 2020-10-21
      • 2019-07-18
      • 2020-02-14
      • 2020-03-21
      • 2020-02-23
      • 2022-01-08
      • 2019-08-27
      相关资源
      最近更新 更多