public async Task UploadFileAsync(MobileServiceFileMetadata metadata, IMobileServiceFileDataSource dataSource, StorageToken storageToken)
        {
            CloudBlockBlob blob = GetBlobReference(storageToken, metadata.FileName);

            using (var stream = await dataSource.GetStream())
            {
                await blob.UploadFromStreamAsync(stream);

                metadata.LastModified = blob.Properties.LastModified;
                metadata.FileStoreUri = blob.Uri.LocalPath;

                stream.Position = 0;
                metadata.ContentMD5 = GetMD5Hash(stream);
            }
        }
        private CloudBlockBlob GetBlobReference(StorageToken token, string fileName)
        {
            CloudBlockBlob blob = null;

            if (token.Scope == StorageTokenScope.File)
            {
                blob = new CloudBlockBlob(new Uri(token.ResourceUri, token.RawToken));
            }
            else if (token.Scope == StorageTokenScope.Record)
            {
                var container = new CloudBlobContainer(new Uri(token.ResourceUri, token.RawToken));

                blob = container.GetBlockBlobReference(fileName);
            }

            return blob;
        }
        public Task<Uri> GetFileUriAsync(StorageToken storageToken, string fileName)
        {
            CloudBlockBlob blob = GetBlobReference(storageToken, fileName);

            return Task.FromResult(new Uri(blob.Uri, storageToken.RawToken));
        }
        public async Task DownloadFileToStreamAsync(MobileServiceFile file, Stream stream, StorageToken storageToken)
        {
            CloudBlockBlob blob = GetBlobReference(storageToken, file.Name);

            await blob.DownloadToStreamAsync(stream);
        }