Запуск Azure Storage Emulator программно

Я использую хранилище BLOB-объектов Azure для хранения фотографий. Работает нормально. Чтобы подключиться к хранилищу, я добавил AzureStorageConfig в свой appsettings.json:

"AzureStorageConfig": {
    "AccountName": "<accountname>",
    "ImageContainer": "<containername>",
    "AccountKey": "<accountkey>"
}

Я дополнительно создал класс AzureStorageConfig

 public class AzureStorageConfig
    {
        public string AccountKey { get; set; }
        public string AccountName { get; set; }
        public string BaseUrl { get; set; }
        public Uri BlobEndpoint { get; set; }
        public string ImageContainer { get; set; }
        public Uri QueueEndpoint { get; set; }
        public Uri TableEndpoint { get; set; }
    }

и настроил его в Startup.cs:

services.Configure<AzureStorageConfig>(Configuration.GetSection(nameof(AzureStorageConfig)));

Таким образом, конфиг может быть введен через внедрение зависимостей.

Для appsettings.development.json Я хотел бы использовать эмулятор хранилища Azure. Я нашел несколько учебных пособий, но все они используют строку подключения для подключения к эмулятору, а не конфигурацию.

Я попытался с данными, которые я нашел на страницах Microsoft:

     "AzureStorageConfig": {
    "AccountName": "devstoreaccount1",
    "ImageContainer": "images",
    "AccountKey": "Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==",
    "BlobEndpoint": "http://127.0.0.1:10000/devstoreaccount1",
    "TableEndpoint": "http://127.0.0.1:10002/devstoreaccount1",
    "QueueEndpoint": "http://127.0.0.1:10001/devstoreaccount1"
}

Я инициализирую объекты так:

public class AzureStorageService
    {
        private readonly CloudBlobContainer _imageContainer;
        private readonly AzureStorageConfig _storageConfig; 

public AzureStorageService(IOptions<AzureStorageConfig> config)
            {  
                _storageConfig = config.Value;
                CloudStorageAccount storageAccount;
                StorageCredentials storageCredentials = new StorageCredentials(_storageConfig.AccountName, _storageConfig.AccountKey);

                if (_storageConfig.BlobEndpoint == null)
                {
                    storageAccount = new CloudStorageAccount(storageCredentials, true);
                }
                else
                {
                    storageAccount = new CloudStorageAccount(
                        storageCredentials,
                        _storageConfig.BlobEndpoint,
                        _storageConfig.QueueEndpoint,
                        _storageConfig.TableEndpoint,
                        null);
                }

                CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
                _imageContainer = blobClient.GetContainerReference(_storageConfig.ImageContainer);
                _imageContainer.CreateIfNotExistsAsync().Wait();
            }
}

Мне пришлось запустить эмулятор вручную, запустив приложение Microsoft Azure Compute Emulator. Как я могу запустить (и инициализировать) эмулятор программно для автоматических тестов (а также для CI Azure Devops, который выполняет эти тесты)?

Большое спасибо.

2 ответа

Решение

Вы должны изменить свой код, чтобы использовать строку подключения, которая аналогична использованию имени учетной записи и ключа, но это будет проще, если вы используете эмулятор, просто изменив строку подключения на "UseDevelopmentStorage=true;",

Что касается запуска эмулятора, вы можете проверить переменную среды хостинга в файле startup.cs для этой среды:

   public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider, ILoggerFactory loggerFactory)
        {
            if (env.IsDevelopment())
            {
                //Start the Emulator here by initiating a new process that calls the emulator.exe file
            }
}

Другое решение будет использовать размещенный сервис и сделать ту же проверку для среды и запустить эмулятор в StartAsync и остановить это в StopAsync

Смотрите эту ссылку для более подробной информации Фоновые задачи с размещенными службами в ASP.NET Core

Кажется, что код, который вы предоставили для доступа к файлу appsetting.json в ядре asp.net, не является проблемой. Вы могли бы обратиться к этой статье.

И когда вы загружаете свой большой двоичный объект, если у вас всегда возникает проблема, это означает, что машина существует, но у нее нет служб, прослушивающих указанный порт, или вас останавливает брандмауэр.

Если это случается время от времени - вы использовали слово "иногда" - и повторная попытка завершается успешно, скорее всего, потому что у сервера полное "отставание".

Другие вопросы по тегам