我在 Azure 门户中的网络聊天测试模拟器上遇到了我认为可能是 HeroCards 的缓存问题。由于 Cortana 不支持 AdaptiveCard,为了完全调试我的机器人,我暂时将 AdaptiveCard 渲染为图像,然后将图像添加到 HeroCard。然后我将 HeroCard 作为附件添加到回复中。
我发现如果我在网络聊天中的 Azure 测试中键入第一个问题 (A),模拟器中会显示正确的图像,但是如果我问不同的问题 (B),则会显示同一张卡片。我可以看到图像在我的缓存图像文件夹中发生了变化,但无法弄清楚为什么卡总是相同的。
我在卡片标题上添加了时间戳,以证明它不是同一张卡片。这是我来自问题 A 的代码。问题 B 的代码仅在生成的 AdaptiveCard 中有所不同。
SingleDayCompactCard card = new SingleDayCompactCard(p1, p2, p3);
// Start of temporary code
Activity reply = activity.CreateReply();
reply.Attachments = new List<Attachment>();
Attachment attachment = await AdaptiveCardToHeroAttachment(card);
reply.Attachments.Add(attachment);
// end of temporary code - remove when Cortana supports Adaptive cards
ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));
await connector.Conversations.ReplyToActivityAsync(reply);
async Task<Attachment> AdaptiveCardToHeroAttachment(AdaptiveCard card)
{
AdaptiveHostConfig hostConfig = new AdaptiveHostConfig()
{
SupportsInteractivity = false
};
string path = HttpContext.Current.Request.MapPath(@"\cache\temp.png");
// Create a renderer
AdaptiveCardRenderer renderer = new AdaptiveCardRenderer(hostConfig);
RenderedAdaptiveCardImage raci = null;
try
{
AdaptiveCardParseResult parseResult = AdaptiveCard.FromJson(card.ToJson());
AdaptiveCard c = parseResult.Card;
raci =
await renderer.RenderCardToImageAsync(c, true);
}
catch (Exception e)
{
}
using (System.IO.FileStream output = new System.IO.FileStream(path, FileMode.Create, FileAccess.Write))
{
await raci.ImageStream.CopyToAsync(output);
await output.FlushAsync();
output.Close();
}
HeroCard hero = new HeroCard();
hero.Title = DateTime.Now.ToLongTimeString();
hero.Images.Add(new CardImage("http://localhost:3979/cache/temp.png"));
return hero.ToAttachment();
}