使用推荐人 Header 从 URL 加载图像

Load Image from URL with a Referrer Header

我需要从我的 CDN 下载静态图像并将它们显示在我的 Xamarin.Forms 视图中。我是 Xamarin 的新手,我很难弄清楚如何从从 HTTP 请求中提取的字节数组加载图像。

我的视图中有以下 XAML:

    <ListView ItemsSource="{Binding Images}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ImageCell ImageSource="{Binding .}">
                    
                </ImageCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

在我后面的代码中,我正在获取图像并尝试绑定到 ImageSource 个实例的 Collection。

    public partial class MainPage : ContentPage
    {
        public MainPage()
        {
            InitializeComponent();
        }

        public ObservableCollection<ImageSource> Images { get; set; } = new ObservableCollection<ImageSource>();

        protected override async void OnAppearing()
        {
            base.OnAppearing();

            var client = new HttpClient();
            client.DefaultRequestHeaders.Add("Referer", "https://foo.bar/");
            var response = await client.GetAsync("https://foo.bar/library/5.jpg");

            byte[] image = await response.Content.ReadAsByteArrayAsync();
            var imageSource = ImageSource.FromStream(() => new MemoryStream(image));
            this.Images.Add(imageSource);
        }
    }

当我这样做时,StackLayout 中的图像是空的。我知道我可以改为只绑定到 URL,ImageSource 可以为我下载它,但我需要传递 Referrer Header。无论如何,我看不到强制 XAML Image 视图允许自定义 headers,如果我实例化 ImageSource 的实例,我也看不到这样做的方法] 在我后面的代码中。

当我阅读 ImageSource 上的文档时,它听起来好像只支持 URI、文件、流和应用程序资源来加载图像。因为我有一个字节数组,所以我将它包装在 MemoryStream 中并调用 ImageSource.FromStream。虽然应用程序运行时没有加载 - ImageCell 为空。

我知道图像已下载。我将 byte[] 转换为 Base64 字符串,然后将其放入 Base64 to Image Decoder。图像加载没有问题,所以我知道它正在正确下载。我不明白的是为什么我无法在 ImageSource.

上渲染图像

我也试过只使用普通的 Image 控件,但遇到了同样的问题。

    <ScrollView>
        <ContentView>
            <StackLayout BindableLayout.ItemsSource="{Binding Images}" Orientation="Horizontal">
                <BindableLayout.ItemTemplate>
                    <DataTemplate>
                        <Image Source="{Binding}"></Image>
                    </DataTemplate>
                </BindableLayout.ItemTemplate>
            </StackLayout>
        </ContentView>
    </ScrollView>

我是不是做错了什么,或者是从互联网上动态下载带有特殊 Header 的图像,这是我在 Xamarin.Forms 中做不到的?

尝试在页面构造函数中添加 this.BindingContext = this;

   public MainPage()
   {
        InitializeComponent();

        this.BindingContext = this;
   }