【问题标题】:Dynamic adaptive card with MS TeamsMS Teams 的动态自适应卡
【发布时间】:2020-02-17 18:38:39
【问题描述】:

我们正在为基于 MS Teams 的 BOT 动态渲染自适应卡片。我们面临的问题是卡片在 WebChat 或 Emulator 上呈现良好,但在从 MS Teams 调用时捕获异常。

我们使用了自适应卡片的文档以及设计器,但似乎都不起作用。我们现在很好奇渲染 MS Teams 是否需要一些特殊修复才能工作。根据在线提供的文档,我们已尝试使用“msteams”作为 id。

自适应卡代码

cardRequest.Body.Add(new AdaptiveContainer()
        {
            Items = new List<AdaptiveElement>
            {
            new AdaptiveTextBlock()
            {
                 Text = CatalogSubject,
                 Size = AdaptiveTextSize.Default,
                 Weight = AdaptiveTextWeight.Bolder,
            },
            new AdaptiveColumnSet()
            {
                Columns = new List<AdaptiveColumn>()
                {
                    new AdaptiveColumn()
                    {
                        Items = new List<AdaptiveElement>()
                        {
                            new AdaptiveImage()
                            {
                               Style = AdaptiveImageStyle.Default,
                                 Url =new Uri("https://pleudepooopsdemo02.service-now.com/c4b933e9471211002ee987e8dee49064.iix"),

                                Separator=true,
                                Size =  AdaptiveImageSize.Large,
                            }
                        },
                       Separator =true,
                        Width="auto",
                    },
                    new AdaptiveColumn()
                    {
                        Items = new List<AdaptiveElement>()
                        {
                            new AdaptiveTextBlock()
                            {
                                Text=  subCatdescription,
                                Weight= AdaptiveTextWeight.Default,
                                Separator=true,
                                Size = AdaptiveTextSize.Small,
                                Wrap =true,

                            }

                        },
                        Separator =true,
                        Width="stretch",
                    },

                }

            },
            new AdaptiveFactSet()
            {
               Facts = new List<AdaptiveFact>()
               {
                new AdaptiveFact{Title =  "Price",Value =catalogType.scSubCategoryPrice},
                new AdaptiveFact{Title =  "Quantity",Value ="1"},
                new AdaptiveFact{Title = "Email",Value= serviceNowHelper.ParseEmailId(sc.Context.Activity.From.Id, sc.Context.Activity.Conversation.Id, sc.Context.Activity.ServiceUrl, sc.Context.Activity.ChannelId) },
                new AdaptiveFact{Title = "sysid",Value=catalogType1.scSubcategorySysid},
                new AdaptiveFact{Title="PassingValue",Value=catalogType.scSubCategoryName.Substring(catalogType.scSubCategoryName.IndexOf('.') + 1)}

               }
            },

            }


        });
        var button = new CardAction()
        {
            Type = "Action.Submit",
            Title="Create Request",
            DisplayText="I clicked this button",
            Value="{\"Create\": \"" + catalogType.scSubCategoryName.Substring(catalogType.scSubCategoryName.IndexOf('.') + 1) + "\"}"


        };

        AdaptiveAction actions =
                new AdaptiveSubmitAction()
                {
                    Title = "Create Request",
                    Type = "Action.Submit",                      
                    Data = "{\"Create\": \"" + catalogType.scSubCategoryName.Substring(catalogType.scSubCategoryName.IndexOf('.') + 1) + "\"}",



            Id = "create",

                };

        AdaptiveAction actions1 =
               new AdaptiveSubmitAction()
               {
                   Title = "Cancel Request",
                   Type = "Action.Submit",                      
                   Data = "Cancel",
                   Id = "cancel"

               };



        cardRequest.Actions.Add(actions);
        cardRequest.Actions.Add(actions1);

        Object displayCardJson = JsonConvert.DeserializeObject(cardRequest.ToJson());

        List<Attachment> attachmentsList = new List<Attachment>();


        Attachment att = new Attachment()
        {
            Content = displayCardJson,
            ContentType = AdaptiveCard.ContentType

        };

        reply.Attachments.Add(att);                  
        return reply;

COSMOSDB 中的错误消息

        {
"User": {
    "id": "29:1j50LiW4dYQyZQ6T44RruVxuaBfatlBHX0YuD7Hly8pNNAiQuWgcoD5jRGHLphLgokeJ6N6b7O7GODLy2QU3G_A",
    "name": "Mary OfEngland",
    "aadObjectId": "98a69ea5-8d65-4264-9d5c-2f12171258a2",
    "role": "user"
},
"Exception": "Cannot perform runtime binding on a null reference",
"StackTrace": "   at CallSite.Target(Closure , CallSite , Object )\r\n   at System.Dynamic.UpdateDelegates.UpdateAndExecute1[T0,TRet](CallSite site, T0 arg0)\r\n   at FepdePleu.PA.Chatbot.PoC.Dialogs.TicketOpen.GenericRequest.GenericRequestDialog.<>c__DisplayClass40_0.<CreateRequestTicket>b__0(scCatalogCategoryListDetails a) in C:\\Mary\\BotProject\\FepdePleuBOT\\FepdePleu.PA.Chatbot.PoC\\FepdePleu.PA.Chatbot.PoC\\Dialogs\\TicketOpen\\GenericRequest\\GenericRequestDialog.cs:line 355\r\n   at System.Linq.Enumerable.WhereSelectListIterator`2.MoveNext()\r\n   at System.Linq.Enumerable.DistinctIterator`1.MoveNext()\r\n   at System.Linq.Enumerable.SingleOrDefault[TSource](IEnumerable`1 source)\r\n   at FepdePleu.PA.Chatbot.PoC.Dialogs.TicketOpen.GenericRequest.GenericRequestDialog.CreateRequestTicket(WaterfallStepContext sc, CancellationToken cancellationToken) in C:\\Mary\\BotProject\\FepdePleuBOT\\FepdePleu.PA.Chatbot.PoC\\FepdePleu.PA.Chatbot.PoC\\Dialogs\\TicketOpen\\GenericRequest\\GenericRequestDialog.cs:line 355\r\n   at Microsoft.Bot.Builder.Dialogs.WaterfallDialog.OnStepAsync(WaterfallStepContext stepContext, CancellationToken cancellationToken)\r\n   at Microsoft.Bot.Builder.Dialogs.WaterfallDialog.RunStepAsync(DialogContext dc, Int32 index, DialogReason reason, Object result, CancellationToken cancellationToken)\r\n   at Microsoft.Bot.Builder.Dialogs.WaterfallDialog.ResumeDialogAsync(DialogContext dc, DialogReason reason, Object result, CancellationToken cancellationToken)\r\n   at Microsoft.Bot.Builder.Dialogs.DialogContext.EndDialogAsync(Object result, CancellationToken cancellationToken)\r\n   at Microsoft.Bot.Builder.Dialogs.Prompt`1.ContinueDialogAsync(DialogContext dc, CancellationToken cancellationToken)\r\n   at Microsoft.Bot.Builder.Dialogs.DialogContext.ContinueDialogAsync(CancellationToken cancellationToken)\r\n   at FepdePleu.PA.Chatbot.PoC.InterruptableDialog.OnContinueDialogAsync(DialogContext dc, CancellationToken cancellationToken) in C:\\Mary\\BotProject\\FepdePleuBOT\\FepdePleu.PA.Chatbot.PoC\\FepdePleu.PA.Chatbot.PoC\\Dialogs\\Shared\\InterruptableDialog.cs:line 39\r\n   at Microsoft.Bot.Builder.Dialogs.ComponentDialog.ContinueDialogAsync(DialogContext outerDc, CancellationToken cancellationToken)\r\n   at Microsoft.Bot.Builder.Dialogs.DialogContext.ContinueDialogAsync(CancellationToken cancellationToken)\r\n   at FepdePleu.PA.Chatbot.PoC.RouterDialog.OnContinueDialogAsync(DialogContext innerDc, CancellationToken cancellationToken) in C:\\Mary\\BotProject\\FepdePleuBOT\\FepdePleu.PA.Chatbot.PoC\\FepdePleu.PA.Chatbot.PoC\\Dialogs\\Shared\\RouterDialog.cs:line 29\r\n   at Microsoft.Bot.Builder.Dialogs.ComponentDialog.ContinueDialogAsync(DialogContext outerDc, CancellationToken cancellationToken)\r\n   at Microsoft.Bot.Builder.Dialogs.DialogContext.ContinueDialogAsync(CancellationToken cancellationToken)\r\n   at FepdePleu.PA.Chatbot.PoC.ChatbotPoC.OnTurnAsync(ITurnContext turnContext, CancellationToken cancellationToken) in C:\\Mary\\BotProject\\FepdePleuBOT\\FepdePleu.PA.Chatbot.PoC\\FepdePleu.PA.Chatbot.PoC\\ChatbotPoC.cs:line 95\r\n   at Microsoft.Bot.Builder.AutoSaveStateMiddleware.OnTurnAsync(ITurnContext turnContext, NextDelegate next, CancellationToken cancellationToken)\r\n   at Microsoft.Bot.Builder.TranscriptLoggerMiddleware.OnTurnAsync(ITurnContext turnContext, NextDelegate nextTurn, CancellationToken cancellationToken)\r\n   at Microsoft.Bot.Builder.MiddlewareSet.ReceiveActivityWithStatusAsync(ITurnContext turnContext, BotCallbackHandler callback, CancellationToken cancellationToken)\r\n   at Microsoft.Bot.Builder.BotAdapter.RunPipelineAsync(ITurnContext turnContext, BotCallbackHandler callback, CancellationToken cancellationToken)",
"date": "2019-10-21T11:03:56.4735109+00:00",
"id": "360c5e3a-98ee-47a6-96c7-c2d135cc6dcd",
"_rid": "V8ZNAMmmWUa-BgAAAAAAAA==",
"_self": "dbs/V8ZNAA==/colls/V8ZNAMmmWUY=/docs/V8ZNAMmmWUa-BgAAAAAAAA==/",
"_etag": "\"05006368-0000-0300-0000-5dad909c0000\"",
"_attachments": "attachments/",
"_ts": 1571655836

}

【问题讨论】:

  • 能否请您检查数据是否即将到来?似乎数据为空
  • 是的,它适用于 WebChat 和模拟器,但不适用于 MS Teams。我们不明白为什么会这样。事实上,我们已经在模拟器上硬编码了相同的电子邮件地址,它会返回数据。任何见解都会有所帮助
  • 能否请您检查委派和应用程序权限?
  • @SashSheen 你能用displayCardJson 的内容更新你的问题吗(你需要一个断点或Console.Write())?
  • 添加参考

标签: botframework microsoft-teams adaptive-cards


【解决方案1】:

这为我们解决了问题。可在自适应卡片的 Github 问题下找到。

这与 AdaptiveCards 中的错误有关 包:microsoft/AdaptiveCards#2148 尝试构建您的附件 像这样:

Attachment attachment = new Attachment() {  ContentType = AdaptiveCard.ContentType,     Content = JsonConvert.DeserializeObject(JsonConvert.SerializeObject(card)), };

【讨论】:

    猜你喜欢
    • 2021-02-06
    • 2021-12-05
    • 2021-06-17
    • 2021-03-04
    • 1970-01-01
    • 2021-12-01
    • 2020-04-30
    • 2021-07-10
    • 2021-04-01
    相关资源
    最近更新 更多