Ошибка при попытке добавить URI хранилища BLOB-объектов Azure в таблицу хранилища Azure

Я пытаюсь добавить изображения в хранилище BLOB-объектов Azure (эта часть программы работает правильно).

После того, как каждое изображение окажется в хранилище BLOB-объектов, я хочу создать таблицу хранилища Azure с сущностью, имеющей два столбца. Категория изображения и URI изображения.

Когда я пытаюсь вставить данные в таблицу хранилища Azure, приложение переходит в «режим прерывания».

В конечном итоге это будет использоваться мобильным приложением, которое использует таблицу для выбора URI изображений в качестве источника изображений для представления сетки, поэтому мне нужен полный URI.

Я жестко запрограммировал категорию, чтобы попытаться сузить проблему.

Я использую эмулятор хранения Azure во время разработки. К вашему сведению.

using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.WindowsAzure.Storage.Queue;
using Microsoft.WindowsAzure.Storage.Table;
using System;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace AzureEmulatorTests
{
    class Program
    {
        static async Task Main(string[] args)
        {
            const string localPath = "./data/";
            const string containerName = "mycontainer";
            const string tableName = "mytable";

            var storageAccount = CloudStorageAccount.Parse(@"UseDevelopmentStorage=true");

            var blobClient = storageAccount.CreateCloudBlobClient();
            var container = blobClient.GetContainerReference(containerName);
            await container.CreateIfNotExistsAsync();

            var tableClient = storageAccount.CreateCloudTableClient();
            var table = tableClient.GetTableReference(tableName);
            await table.CreateIfNotExistsAsync();

            string[] filenames = Directory.GetFiles(localPath);

            foreach (var images in filenames)
            {
                string _imageBlobReference = Guid.NewGuid() + ".jpg";

                var blob = container.GetBlockBlobReference(_imageBlobReference);
                await blob.UploadFromFileAsync(images);
                string blobUrl = blob.Uri.AbsoluteUri;

                ImageFile image = new ImageFile("Birthday", blobUrl);

                await table.ExecuteAsync(TableOperation.Insert(image));
            }

            Console.WriteLine("Files Uploaded... Press any key to continue.");
            Console.ReadKey();
        }
    }

    class ImageFile : TableEntity
    {
        public ImageFile(string Category, string ImageURL)
        {
            PartitionKey = Category;
            RowKey = ImageURL;
        }
    }
}

person Newbee    schedule 06.05.2020    source источник


Ответы (2)


В основном проблема связана со значением вашего атрибута RowKey, поскольку он содержит недопустимый символ (/).

Список запрещенных символов в PartitionKey и RowKey см. На этой странице: https://docs.microsoft.com/en-us/rest/api/storageservices/understanding-the-table-service-data-model.

Чтобы решить эту проблему, закодируйте URL-адрес полностью, а затем попробуйте сохранить его. Это должно сработать.

person Gaurav Mantri    schedule 06.05.2020

Решение, которое я нашел, - не указывать URL-адрес в свойствах PartitionKey или Rowkey.

Когда я добавил в таблицу строковое свойство, я смог без проблем добавить URL-адрес.

person Newbee    schedule 13.05.2020