예제 #1
0
        /// <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.");
            }
        }
예제 #2
0
 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);
         }
         );
     }
 }
예제 #3
0
        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));
            }
        }
예제 #4
0
        /// <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.");
            }
        }
예제 #5
0
        /// <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);
        }