Это образец документации 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();
});
}
}





«Верхняя часть» первого опубликованного вами блока JSON - это карточка, содержащаяся в действии. Второй опубликованный блок JSON - это действительно просто сама карта и то, что вы хотите поместить в Attachment.
Что касается вашего кода, мне он кажется правильным. Я мог бы подумать о кешировании прикрепленного файла JSON, поскольку вы, вероятно, не хотите попадать в файловую систему каждый раз, когда хотите отобразить карточку, но это будет просто оптимизацией.
Мне неясно, испытываете ли вы какие-либо дальнейшие проблемы или просто ищете валидацию подхода сейчас. Если проблема не исчезла, обновите вопрос, добавив более подробную информацию, и я обновлю свой ответ, чтобы попытаться помочь.
Мне удалось сделать карту карусели на C#, а не на json-файле. Кстати, это мой репозиторий, сэр, если у вас есть время, вы можете проверить улучшения. Спасибо github.com/bnj123/azureBot
Что ж, я рад, что у тебя все получилось. Похоже, вы перешли на использование карт героев вместо адаптивных. Вы часто обнаруживаете, что определенные каналы / клиенты просто еще не имеют полной поддержки Adaptive Cards. Эмулятор и веб-клиент, как правило, поддерживают большинство функций, но, возможно, то, что вы делали раньше, еще не поддерживалось.
В этом есть большой смысл, спасибо вам за все, что вы мне помогли, сэр Дрю! Кстати, в чем разница между cancellationToken: cancellationToken и cancellationToken? И в чем его важность?
В cancellationToken: cancellationToken имя перед двоеточием - это имя параметра в методе, который вы вызываете. Это необходимо для устранения неоднозначности, когда конкретный метод имеет много необязательных параметров, и вы не обязательно передаете их по порядку. К сожалению, некоторые API-интерфейсы в Bot Builder SDK стали слишком удобными с использованием дополнительных параметров вместо обеспечения нескольких перегрузок. Теперь разработчики должны быть более подробными при устранении неоднозначности параметров. Некоторые из этих API со временем можно сгладить, но другие нельзя исправить, не нарушая изменений. ?
У меня проблемы, сэр, так как первый код не отображается на эмуляторе бота. Когда я запускаю на эмуляторе, он говорит: «Может 'отобразить карту'». Но когда я удаляю верхнюю часть, которая является вторым кодом, эмулятор бота отображает его, и я вижу карту. Моя проблема в том, что я хочу сделать карту карусели, поэтому я думаю, что мне нужна верхняя часть кода.