/// <summary> /// Save the provided <paramref name="data"/> asynchronously. /// </summary> protected virtual void AsyncSaveData <TSaveData, TResult>(TSaveData data, Func <TSaveData, CloudTable, TResult> function, Func <TSaveData, string> customFilenameFunction = null) { IList <Task> persistTasks = new List <Task>(); foreach (Tuple <CloudStorageAccount, CloudTable> tuple in WritableCollection) { TSaveData taskData = data; CloudTable table = tuple.Item2; Task task = Task.Factory.StartNewSafely ( () => { AzureStorageRetryPolicy.ExecuteAction(() => function(taskData, table)); } ); persistTasks.Add(task); } bool anyFailed = Task.Factory.ContinueWhenAll(persistTasks.ToArray(), tasks => { return(tasks.Any(task => task.IsFaulted)); }).Result; if (anyFailed) { throw new AggregateException("Persisting data to table storage failed. Check the logs for more details."); } }
public void Destroy(TData data) { foreach (Tuple <CloudStorageAccount, CloudBlobContainer> tuple in WritableCollection) { CloudBlockBlob cloudBlockBlob = GetBlobReference(tuple.Item2, string.Format("{0}.json", GenerateFileName(data))); AzureStorageRetryPolicy.ExecuteAction ( () => { cloudBlockBlob.DeleteIfExists(DeleteSnapshotsOption.IncludeSnapshots); } ); } }
public void Add(TData data) { foreach (Tuple <CloudStorageAccount, CloudBlobContainer> tuple in WritableCollection) { CloudBlockBlob cloudBlockBlob = GetBlobReference(tuple.Item2, string.Format("{0}.json", GenerateFileName(data))); Uri uri = AzureStorageRetryPolicy.ExecuteAction ( () => { cloudBlockBlob.UploadFromStream(Serialise(data)); cloudBlockBlob.Properties.ContentType = "application/json"; cloudBlockBlob.SetProperties(); return(cloudBlockBlob.Uri); } ); Logger.LogDebug(string.Format("The data entity '{0}' was persisted at uri '{1}'", string.Format("{0}.json", GenerateFileName(data)), uri)); } }
/// <summary> /// Save the provided <paramref name="data"/> asynchronously. /// </summary> protected virtual void AsyncSaveData <TResult>(TData data, Func <TData, CloudBlockBlob, TResult> function, Func <TData, string> customFilenameFunction = null) { IList <Task> persistTasks = new List <Task>(); foreach (Tuple <CloudStorageAccount, CloudBlobContainer> tuple in WritableCollection) { TData taskData = data; CloudBlobContainer container = tuple.Item2; Task task = Task.Factory.StartNewSafely ( () => { string fileName = string.Format("{0}.json", (customFilenameFunction ?? GenerateFileName)(taskData)); CloudBlockBlob cloudBlockBlob = GetBlobReference(container, fileName); if (typeof(TResult) == typeof(Uri)) { Uri uri = AzureStorageRetryPolicy.ExecuteAction(() => (Uri)(object)function(taskData, cloudBlockBlob)); Logger.LogDebug(string.Format("The data entity '{0}' was persisted at uri '{1}'", fileName, uri)); } else { AzureStorageRetryPolicy.ExecuteAction(() => function(taskData, cloudBlockBlob)); } } ); persistTasks.Add(task); } bool anyFailed = Task.Factory.ContinueWhenAll(persistTasks.ToArray(), tasks => { return(tasks.Any(task => task.IsFaulted)); }).Result; if (anyFailed) { throw new AggregateException("Persisting data to blob storage failed. Check the logs for more details."); } }
/// <summary> /// Creates a container with the specified name <paramref name="containerName"/> if it doesn't already exist. /// </summary> /// <param name="storageAccount">The storage account to create the container is</param> /// <param name="containerName">The name of the container.</param> /// <param name="isPublic">Whether or not this container is publicly accessible.</param> protected virtual CloudBlobContainer CreateContainer(CloudStorageAccount storageAccount, string containerName, bool isPublic = true) { CloudBlobContainer container = null; AzureStorageRetryPolicy.ExecuteAction ( () => { CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); container = blobClient.GetContainerReference(GetSafeContainerName(containerName)); container.CreateIfNotExists(); if (isPublic) { container.SetPermissions(new BlobContainerPermissions { PublicAccess = BlobContainerPublicAccessType.Blob }); } } ); return(container); }