Запуск 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, не является проблемой. Вы могли бы обратиться к этой статье.
И когда вы загружаете свой большой двоичный объект, если у вас всегда возникает проблема, это означает, что машина существует, но у нее нет служб, прослушивающих указанный порт, или вас останавливает брандмауэр.
Если это случается время от времени - вы использовали слово "иногда" - и повторная попытка завершается успешно, скорее всего, потому что у сервера полное "отставание".