Адаптивные карты - обслуживание изображений в байтах - PullRequest
0 голосов
/ 13 апреля 2019

Я пытаюсь поместить изображение в Adaptive Card в платформу бота следующим образом:

card.Body.Add(new AdaptiveImage()
{
    Type = "Image",
    Url = new Uri(pictureUrl),
    Size = AdaptiveImageSize.Large
});

Это работает.Проблема с URL.Я получаю изображения из внешнего веб-сервиса в формате Base64.Но иногда я получаю слишком большое изображение, поэтому я получаю исключение The uri string is too long.

Есть ли способ решить эту проблему?Например, включите помещение изображения в адаптивную карту в байтах.

1 Ответ

1 голос
/ 10 мая 2019

спасибо за сообщение об этой проблеме. Основная причина в том, что pictureUrl длиннее, чем максимальная длина URI .NET. Мы отслеживаем это исправление здесь .

Существует довольно простой обходной путь, поскольку в библиотеке .NET C # используется ограничение, которое вы используете для простого создания карты, но WebChat не использует библиотеку C # для отображения карточек (он использует библиотеку JS). , а JS / HTML не имеет ограничения по длине!). Поэтому единственное, что не работает в вашем случае, - это генерирование JSON ... но есть простое исправление!

Обход : Определите следующий класс, расширяющий AdaptiveImage, добавляющий свойство LongUrl (которое записывает в то же свойство url в JSON).

public class AdaptiveImageWithLongUrl : AdaptiveImage
{
    [JsonProperty(PropertyName = "url", Required = Required.Always)]
    public string LongUrl { get; set; }
}

Затем , используйте новый класс изображений и новое свойство при назначении длинных URL-адресов!

// A data URL that's longer than .NET max length
string actualUrl = "data:image/gif;base64," + string.Join("", new int[120000].Select(i => "A")) + "end";

AdaptiveCard card = new AdaptiveCard("1.0")
{
    Body =
    {
        new AdaptiveImageWithLongUrl()
        {
            LongUrl = actualUrl
        }
    }
};

// Place the JObject in the attachment!
var attachment = new Attachment()
{
    Content = card,
    ContentType = "application/vnd.microsoft.card.adaptive",
    Name = "cardName"
};
...