1

我正在使用 Azure Blob 存储来存储照片。它工作正常。为了连接到存储,我在我的添加了一个 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”应用程序手动启动模拟器。如何以编程方式为自动化测试(以及运行这些测试的 Azure Devops CI)启动(和初始化)模拟器?

非常感谢。

4

2 回答 2

1

您应该将代码更改为使用连接字符串,这与使用帐户名和密钥相同,但是当您使用模拟器时,只需将连接字符串更改为"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 中托管服务的后台任务

于 2018-12-29T05:04:33.487 回答
0

您提供的用于访问 asp.net core 中的 appsetting.json 文件的代码似乎没有问题。你可以参考这篇文章

当你上传你的blob时,如果你总是遇到问题,这意味着机器存在,但它没有服务在指定的端口上监听,或者有防火墙阻止你。

如果它偶尔发生——你使用了“有时”这个词——并且重试成功,很可能是因为服务器有一个完整的“积压”。

于 2018-12-24T08:45:39.280 回答