using Microsoft.Azure.Cosmos.Table; using Microsoft.Extensions.Options; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; using Microsoft.Extensions.DependencyInjection; using Azure.Storage.Blobs; using Azure.Storage.Blobs.Models; using Azure.Storage.Blobs.Specialized; using Azure.Storage.Sas; using Azure.Storage; using TEAMModelOS.SDK.Extension; using Azure.Storage.Queues; namespace TEAMModelOS.SDK.DI { public class AzureStorageFactory { private readonly IServiceProvider _services; private readonly IOptionsMonitor _optionsMonitor; private readonly ILogger _logger; public AzureStorageFactory(IServiceProvider services, IOptionsMonitor optionsMonitor, ILogger logger) { if (services == null) throw new ArgumentNullException(nameof(services)); if (optionsMonitor == null) throw new ArgumentNullException(nameof(optionsMonitor)); _services = services; _optionsMonitor = optionsMonitor; _logger = logger; } public BlobServiceClient GetBlobServiceClient(string name = "Default") { try { var options = _optionsMonitor.Get(name); return new BlobServiceClient(options.StorageAccountConnectionString); } catch (OptionsValidationException e) { _logger?.LogWarning(e, e.Message); return null; } } public BlobContainerClient GetBlobContainerClient(string containerName, string name = "Default") { try { var options = _optionsMonitor.Get(name); return new BlobContainerClient(options.StorageAccountConnectionString, containerName); } catch (OptionsValidationException e) { _logger?.LogWarning(e, e.Message); return null; } } public BlobBatchClient GetBlobBatchClient(string name = "Default") { try { var options = _optionsMonitor.Get(name); BlobServiceClient blobServiceClient = new BlobServiceClient(options.StorageAccountConnectionString); return blobServiceClient.GetBlobBatchClient(); } catch (OptionsValidationException e) { _logger?.LogWarning(e, e.Message); return null; } } /// /// 取得Blob SAS (有效期預設一天) /// public string GetBlobSAS(string containerName, string blobName, BlobSasPermissions blobSasPermissions, string name = "Default") { try { var keys = Utils.ParseConnectionString(_optionsMonitor.Get(name).StorageAccountConnectionString); var accountname = keys["AccountName"]; var accountkey = keys["AccountKey"]; var endpoint = keys["EndpointSuffix"]; var blobSasBuilder = new BlobSasBuilder { StartsOn = DateTimeOffset.UtcNow.Subtract(new TimeSpan(0, 15, 0)), ExpiresOn = DateTimeOffset.UtcNow.Add(new TimeSpan(1, 0, 15, 0)), BlobContainerName = containerName }; blobSasBuilder.SetPermissions(blobSasPermissions); var sskc = new StorageSharedKeyCredential(accountname, accountkey); BlobSasQueryParameters sasQueryParameters = blobSasBuilder.ToSasQueryParameters(sskc); UriBuilder fullUri = new UriBuilder() { Scheme = "https", Host = $"{accountname}.blob.{endpoint}", Path = blobName, Query = sasQueryParameters.ToString() }; return sasQueryParameters.ToString(); } catch { return null; } } public CloudTableClient GetCloudTableClient(string name = "Default") { try { var options = _optionsMonitor.Get(name); CloudStorageAccount storageAccount = CloudStorageAccount.Parse(options.StorageAccountConnectionString); return storageAccount.CreateCloudTableClient(); } catch (OptionsValidationException e) { _logger?.LogWarning(e, e.Message); return null; } } /// /// 可讓您管理儲存體帳戶中的所有佇列 /// /// /// public QueueServiceClient GetQueueServiceClient(string name = "Default") { try { var options = _optionsMonitor.Get(name); return new QueueServiceClient(options.StorageAccountConnectionString); } catch (OptionsValidationException e) { _logger?.LogWarning(e, e.Message); return null; } } /// /// 可讓您管理和操作個別佇列及其訊息 /// /// /// /// public QueueClient GetQueueClient(string queueName, string name = "Default") { if (name == null) throw new ArgumentNullException(nameof(name)); try { var options = _optionsMonitor.Get(name); return new QueueClient(options.StorageAccountConnectionString, queueName); } catch (OptionsValidationException e) { _logger?.LogWarning(e, e.Message); return null; } } } }