public bool GetTenantDiscourseFileUrl(Tenant tenant, DiscoursePostVersionAttachment discoursePostVersionAttachment, out string url, out Exception exception)
        {
            var result = false;

            url       = string.Empty;
            exception = null;

            try
            {
                var connectionString = tenant.StorageConnectionStringPrimary;
                var account          = CloudStorageAccount.Parse(connectionString);
                var client           = account.CreateCloudBlobClient();
                var container        = client.GetContainerReference("discourseexternaldocuments");// tenant.UrlResourceGroup);

                container.CreateIfNotExists();
                container.SetPermissions(new BlobContainerPermissions {
                    PublicAccess = BlobContainerPublicAccessType.Container,
                });

                var blob = container.GetBlockBlobReference(discoursePostVersionAttachment.FileNameServer);

                url    = blob.Uri.AbsoluteUri;
                result = true;
            }
            catch (Exception e)
            {
                exception = e;
            }

            return(result);
        }
        public bool DiscourseDocumentUpload(TenantUserSession tenantUserSession, DiscoursePostVersionAttachment discourseDocument, Stream stream, CancellationToken cancellationToken, out Exception exception)
        {
            var result = false;

            exception = null;

            try
            {
                var connectionString = tenantUserSession.Tenant.StorageConnectionStringPrimary;
                var account          = CloudStorageAccount.Parse(connectionString);
                var client           = account.CreateCloudBlobClient();
                var container        = client.GetContainerReference("discourseexternaldocuments");
                container.CreateIfNotExists();
                container.SetPermissions(new BlobContainerPermissions {
                    PublicAccess = BlobContainerPublicAccessType.Off,
                });
                var blob    = container.GetBlockBlobReference(discourseDocument.Id.ToString() + "." + GlobalConstants.FileExtensionCloud);
                var running = true;
                var watch   = System.Diagnostics.Stopwatch.StartNew();
                stream.Seek(0, SeekOrigin.Begin);
                blob.DeleteIfExists(DeleteSnapshotsOption.IncludeSnapshots);
                var task = blob.UploadFromStreamAsync(stream, cancellationToken);

                do
                {
                    switch (task.Status)
                    {
                    case TaskStatus.Canceled:
                    case TaskStatus.Faulted:
                    case TaskStatus.RanToCompletion:
                    { running = false; break; }
                    }

                    Thread.Sleep(TimeSpan.FromSeconds(1));
                    cancellationToken.ThrowIfCancellationRequested();
                }while (running);

                switch (task.Status)
                {
                case TaskStatus.Faulted:
                case TaskStatus.Canceled:
                {
                    running = false;
                    throw (task.Exception ?? new Exception("The upload task encountered an unknown exception."));
                }
                }

                result = true;
            }
            catch (Exception e)
            {
                exception = e;
            }

            return(result);
        }
        public bool GetDiscourseDocumentFileStream(Tenant tenant, DiscoursePostVersionAttachment discoursePostVersionAttachment, out Stream stream, out Exception exception)
        {
            var result = false;

            stream    = null;
            exception = null;

            try
            {
                var connectionString = tenant.StorageConnectionStringPrimary;
                var account          = CloudStorageAccount.Parse(connectionString);
                var client           = account.CreateCloudBlobClient();
                var container        = client.GetContainerReference("discourseexternaldocuments");// tenant.UrlResourceGroup);

                container.CreateIfNotExists();
                container.SetPermissions(new BlobContainerPermissions {
                    PublicAccess = BlobContainerPublicAccessType.Off,
                });

                var blob = container.GetBlockBlobReference(discoursePostVersionAttachment.FileNameServer);

                stream = new MemoryStream();
                blob.DownloadToStream(stream);
                result = true;
            }
            catch (Exception e)
            {
                if (stream != null)
                {
                    try { stream.Dispose(); }
                    finally { stream = null; }
                }

                exception = e;
            }

            return(result);
        }