【发布时间】:2019-07-24 06:12:14
【问题描述】:
我在我的 Bot 中使用 Adaptive card version 1.2 和 Bot 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 > Resource Group > App Service > Configuration中 -
对不起。忘记@.提及您,并想确保您收到通知。
标签: botframework adaptive-cards