自适应卡-以字节为单位提供图像

时间:2019-04-13 09:25:50

标签: c# botframework adaptive-cards

我试图像这样将图像放入Bot框架中的Adaptive Card中:

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

正在工作。问题出在Url。我从外部Web服务以Base64格式获取图像。但是有时我得到的图像太大,因此出现The uri string is too long异常。

有什么办法可以解决这个问题?例如,启用以字节为单位将图像放入自适应卡中。

1 个答案:

答案 0 :(得分:1)

感谢您报告此问题。根本原因是pictureUrl大于.NET的最大Uri长度。我们是tracking fixing this here

有一个非常简单的解决方法,因为限制是在.NET C#库中发生的,您仅用于编写卡片,但WebChat并不使用C#库显示卡片(它使用JS库) ,而JS / HTML没有长度限制!)。因此,在您的情况下唯一不起作用的是生成JSON ...,但是有一个简单的解决方法!

解决方法: 定义以下类,扩展AdaptiveImage,添加一个LongUrl属性(该属性写入JSON中相同的url属性)。

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

然后,在分配长网址时使用新的图像类和新属性!

// 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"
};