【问题标题】:When Bot is hosted on Azure, I'm unable to retrieve values from Adaptive card in waterfall dialog inside validator method当 Bot 托管在 Azure 上时,我无法在验证器方法内的瀑布对话框中从自适应卡中检索值
【发布时间】:2019-07-24 06:12:14
【问题描述】:

我在我的 Bot 中使用 Adaptive card version 1.2Bot Builder dialog version is 4.5.1。目前我正在使用TextPrompt 在瀑布对话框中调用自适应卡。我编写了一个验证器方法来验证从卡返回的值。这在 Bot Emulator 中运行良好。但是当我在 Azure 上托管它时,我遇到了错误。

在验证器方法中,自适应卡值在promptContext.Recognized.Value 中捕获。但它在 Azure 上托管时会返回 null,这会导致 Object reference not set to an instance of an object 异常。

//DialogClass
 AddDialog(new WaterfallDialog(nameof(WaterfallDialog), new WaterfallStep[]
 {
      AdaptiveCardAsync,            
  }));
  AddDialog(new TextPrompt("AdaptiveCard", CardValidator));


private async Task<DialogTurnResult> SelectedOptionAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)
        {
                    // Get Adaptive Card
                    JObject card = AdaptiveCard();

                    return await stepContext.PromptAsync("AdaptiveCard",
                    new PromptOptions
                    {
                        Prompt = (Activity)MessageFactory.Attachment(new Attachment
                        {
                            ContentType = AdaptiveCard.ContentType,
                            Content = card,
                        }),
                    }, cancellationToken);
}


//Calling adaptive card. 
 public JObject AdaptiveCard()
 {
      string fileName = "GetValues.json";
      // combine path for cross platform support
      string[] paths = { ".", "AdaptiveCards", fileName };
      string fullPath = Path.Combine(paths);
      var adaptiveCard = File.ReadAllText(fullPath);
      JObject card = JObject.Parse(adaptiveCard);
}   

// To validate values received from adaptive card.
 private async Task<bool> CardValidator(PromptValidatorContext<string> promptContext, CancellationToken cancellationToken)
{

var result =  JObject.Parse(promptContext.Recognized.Value);

}  


//Calling Dialog - DialogExtension.cs
 public static class DialogExtension
    {
        public static async Task Run(this Dialog dialog, ITurnContext turnContext, IStatePropertyAccessor<DialogState> accessor, CancellationToken cancellationToken = default(CancellationToken))
        {
            try
            {
                var dialogSet = new DialogSet(accessor);
                dialogSet.Add(dialog);

                var dialogContext = await dialogSet.CreateContextAsync(turnContext, cancellationToken);
                // Ensure that message is a postBack (like a submission from Adaptive Cards)
                if (dialogContext.Context.Activity.GetType().GetProperty("ChannelData") != null)
                {
                    var channelData = JObject.Parse(dialogContext.Context.Activity.ChannelData.ToString());
                    if (channelData.ContainsKey("postBack") || channelData.ContainsKey("postback"))
                    {
                        var postbackActivity = dialogContext.Context.Activity;
                        // Convert the user's Adaptive Card input into the input of a Text Prompt
                        // Must be sent as a string
                        postbackActivity.Text = postbackActivity.Value.ToString();
                        //await dialogContext.Context.SendActivityAsync(postbackActivity);
                    }
                }
                var results = await dialogContext.ContinueDialogAsync(cancellationToken);
                if (results.Status == DialogTurnStatus.Empty)
                {
                    await dialogContext.BeginDialogAsync(dialog.Id, null, cancellationToken);
                }
            }
            catch(Exception ex)
            {
               await turnContext.SendActivityAsync(MessageFactory.Text(ex.Message));
            }
        }

请帮助我解决问题。

【问题讨论】:

  • 在测试您部署的机器人时,您是否使用“在网络聊天中测试”?这使用了 WebChat 的 V3(即将升级到 V4),而 V3 不适用于自适应卡片。
  • @mdrichardson-MSFT 是的..在“网络聊天测试”中进行了测试,并且还使用了网络聊天 URL。能否请您提出解决方案。
  • @mdrichardson-MSFT 今天我又遇到了类似的问题,在我的机器人中我已经集成了 LUIS(版本 4.5)它在模拟器中运行良好。托管时,它没有连接到 LUIS。是不是也是因为网聊版的原因。
  • 关于网络聊天:如果你使用embed iFrame进行测试,那也是使用V3的网络聊天(目前...正在升级中)。这样就可以解释这个问题了。对于 LUIS,请检查以确保来自 appsettings.json 的 LUIS 设置也在 Azure Portal &gt; Resource Group &gt; App Service &gt; Configuration
  • 对不起。忘记@.提及您,并想确保您收到通知。

标签: botframework adaptive-cards


【解决方案1】:

问题是“网络聊天测试”和网络聊天 iFrame &lt;embed&gt; 代码仍然使用 WebChat V3,它不能很好地支持自适应卡片。 WebChat V4 应该会在接下来的几周内向这两个平台推出。

关于您的 LUIS 问题,请访问:

  1. Azure 门户
  2. 您的资源组
  3. 机器人使用的应用服务

  1. 转到配置

  1. 确保所有配置值与appsettings.json 文件中的值匹配。

这不会影响您的其他 V4 机器人,因为每个机器人应该使用自己的应用服务。

【讨论】:

  • 我为 LUIS 尝试了上述方法,但仍然面临同样的问题。
  • @Gags08 你能包含你的自适应卡片 JSON 吗? DirecLine 连接器(Web Chat 使用)目前仅支持 Adaptive Cards v1.06。如果您的卡包含其他元素,则可能会导致问题。不过有some workarounds
  • 目前我正在等待网络聊天新版本,因为网络聊天中的 v3 不支持自适应卡片 v1.2。
  • 但是您提到的有关 LUIS 问题的解决方案对我不起作用。您能否建议任何其他解决方案。还有我们什么时候可以期待新的网络聊天版本?我已暂停在 Azure 中发布它们。
  • @Gags08 我无法想象还有什么会导致 LUIS 在部署时无法工作,但在本地工作。由于这是一个需要更多详细信息的单独问题,请打开一个包含详细信息和错误消息的新 StackOverflow 问题。网络聊天何时支持 Adaptive Cards v1.2 没有 ETA。我建议不要使用 1.2 的功能或使用上面发布的解决方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-21
  • 1970-01-01
  • 2019-10-11
  • 2021-06-08
相关资源
最近更新 更多