Botframework v4: не удается отобразить карты

Это образец документации Botframework v4. Но это не работает. В эмуляторе бота Microsoft написано «Can't Render Card». Я пытаюсь сделать carouselCard, но эта простая карта из образца Microsoft уже не работает.

    {
  "type": "message",
  "text": "Plain text is ok, but sometimes I long for more...",
  "attachments": [
    {
      "contentType": "application/vnd.microsoft.card.adaptive",
      "content": {
        "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
        "type": "AdaptiveCard",
        "version": "1.0",
        "body": [
          {
            "type": "TextBlock",
            "text": "Hello World!",
            "size": "large"
          },
          {
            "type": "TextBlock",
            "text": "*Sincerely yours,*"
          },
          {
            "type": "TextBlock",
            "text": "Adaptive Cards",
            "separation": "none"
          }
        ],
        "actions": [
          {
            "type": "Action.OpenUrl",
            "url": "http://adaptivecards.io",
            "title": "Learn More"
          }
        ]
      }
    }
  ]
}

Однако, если я удалю верхнюю часть кода, этот код будет работать:

  {
  "$schema": "http://adaptivecards.io/schemas/adaptive-card.json",
  "type": "AdaptiveCard",
  "version": "1.0",
  "body": [
    {
      "type": "TextBlock",
      "text": "Hello World!",
      "size": "large"
    },
    {
      "type": "TextBlock",
      "text": "*Sincerely yours,*"
    },
    {
      "type": "TextBlock",
      "text": "Adaptive Cards",
      "separation": "none"
    }
  ],
  "actions": [
    {
      "type": "Action.OpenUrl",
      "url": "http://adaptivecards.io",
      "title": "Learn More"
    }
  ]
}

Так я называю карту. Есть лучший способ сделать это?

 public class GetNameAndAgeDialog : WaterfallDialog
    {

        private readonly string _cards = @".\Resources\TryCarouselCard.json";

        private static Attachment CreateAdaptiveCardAttachment(string filePath)
        {
            var adaptiveCardJson = File.ReadAllText(filePath);
            var adaptiveCardAttachment = new Attachment()
            {
                ContentType = "application/vnd.microsoft.card.adaptive",
                Content = JsonConvert.DeserializeObject(adaptiveCardJson),
            };
            return adaptiveCardAttachment;
        }

        public GetNameAndAgeDialog(string dialogId, IEnumerable<WaterfallStep> steps = null) : base(dialogId, steps)
        {

            AddStep(async (stepContext, cancellationToken) =>
            {
                var cardAttachment = CreateAdaptiveCardAttachment(_cards);
                var reply = stepContext.Context.Activity.CreateReply();
                reply.Attachments = new List<Attachment>() { cardAttachment };
                await stepContext.Context.SendActivityAsync(reply, cancellationToken);
                return await stepContext.ContinueDialogAsync();
            });
         }
      }
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
993
1

Ответы 1

«Верхняя часть» первого опубликованного вами блока JSON - это карточка, содержащаяся в действии. Второй опубликованный блок JSON - это действительно просто сама карта и то, что вы хотите поместить в Attachment.

Что касается вашего кода, мне он кажется правильным. Я мог бы подумать о кешировании прикрепленного файла JSON, поскольку вы, вероятно, не хотите попадать в файловую систему каждый раз, когда хотите отобразить карточку, но это будет просто оптимизацией.

Мне неясно, испытываете ли вы какие-либо дальнейшие проблемы или просто ищете валидацию подхода сейчас. Если проблема не исчезла, обновите вопрос, добавив более подробную информацию, и я обновлю свой ответ, чтобы попытаться помочь.

У меня проблемы, сэр, так как первый код не отображается на эмуляторе бота. Когда я запускаю на эмуляторе, он говорит: «Может 'отобразить карту'». Но когда я удаляю верхнюю часть, которая является вторым кодом, эмулятор бота отображает его, и я вижу карту. Моя проблема в том, что я хочу сделать карту карусели, поэтому я думаю, что мне нужна верхняя часть кода.

user10860402 07.01.2019 05:37

Мне удалось сделать карту карусели на C#, а не на json-файле. Кстати, это мой репозиторий, сэр, если у вас есть время, вы можете проверить улучшения. Спасибо github.com/bnj123/azureBot

user10860402 07.01.2019 10:23

Что ж, я рад, что у тебя все получилось. Похоже, вы перешли на использование карт героев вместо адаптивных. Вы часто обнаруживаете, что определенные каналы / клиенты просто еще не имеют полной поддержки Adaptive Cards. Эмулятор и веб-клиент, как правило, поддерживают большинство функций, но, возможно, то, что вы делали раньше, еще не поддерживалось.

Drew Marsh 07.01.2019 22:13

В этом есть большой смысл, спасибо вам за все, что вы мне помогли, сэр Дрю! Кстати, в чем разница между cancellationToken: cancellationToken и cancellationToken? И в чем его важность?

user10860402 08.01.2019 01:16

В cancellationToken: cancellationToken имя перед двоеточием - это имя параметра в методе, который вы вызываете. Это необходимо для устранения неоднозначности, когда конкретный метод имеет много необязательных параметров, и вы не обязательно передаете их по порядку. К сожалению, некоторые API-интерфейсы в Bot Builder SDK стали слишком удобными с использованием дополнительных параметров вместо обеспечения нескольких перегрузок. Теперь разработчики должны быть более подробными при устранении неоднозначности параметров. Некоторые из этих API со временем можно сгладить, но другие нельзя исправить, не нарушая изменений. ?

Drew Marsh 08.01.2019 01:56

Другие вопросы по теме