public static void UploadTextAPM(CloudFile file, string text, Encoding encoding, AccessCondition accessCondition = null, FileRequestOptions options = null, OperationContext operationContext = null) { byte[] textAsBytes = encoding.GetBytes(text); using (MemoryStream stream = new MemoryStream()) { stream.Write(textAsBytes, 0, textAsBytes.Length); stream.Seek(0, SeekOrigin.Begin); file.ServiceClient.DefaultRequestOptions.ParallelOperationThreadCount = 2; using (AutoResetEvent waitHandle = new AutoResetEvent(false)) { IAsyncResult result = file.BeginUploadFromStream(stream, accessCondition, options, operationContext, ar => waitHandle.Set(), null); waitHandle.WaitOne(); file.EndUploadFromStream(result); } } }
public void FileStoreContentMD5TestAPM() { FileRequestOptions optionsWithNoMD5 = new FileRequestOptions() { StoreFileContentMD5 = false, }; FileRequestOptions optionsWithMD5 = new FileRequestOptions() { StoreFileContentMD5 = true, }; CloudFileShare share = GetRandomShareReference(); try { share.Create(); using (AutoResetEvent waitHandle = new AutoResetEvent(false)) { IAsyncResult result; CloudFile file = share.GetRootDirectoryReference().GetFileReference("file4"); using (Stream stream = new MemoryStream()) { result = file.BeginUploadFromStream(stream, null, optionsWithMD5, null, ar => waitHandle.Set(), null); waitHandle.WaitOne(); file.EndUploadFromStream(result); } file.FetchAttributes(); Assert.IsNotNull(file.Properties.ContentMD5); file = share.GetRootDirectoryReference().GetFileReference("file5"); using (Stream stream = new MemoryStream()) { result = file.BeginUploadFromStream(stream, null, optionsWithNoMD5, null, ar => waitHandle.Set(), null); waitHandle.WaitOne(); file.EndUploadFromStream(result); } file.FetchAttributes(); Assert.IsNull(file.Properties.ContentMD5); file = share.GetRootDirectoryReference().GetFileReference("file6"); using (Stream stream = new MemoryStream()) { result = file.BeginUploadFromStream(stream, ar => waitHandle.Set(), null); waitHandle.WaitOne(); file.EndUploadFromStream(result); } file.FetchAttributes(); Assert.IsNull(file.Properties.ContentMD5); } } finally { share.DeleteIfExists(); } }
/// <summary> /// Single put file and get file /// </summary> /// <param name="fileSize">The file size.</param> /// <param name="bufferSize">The output buffer size.</param> /// <param name="bufferOffset">The output buffer offset.</param> /// <param name="fileOffset">The file offset.</param> /// <param name="length">Length of the data range to download.</param> /// <param name="option">0 - Sync, 1 - APM and 2 - APM overload.</param> private void DoDownloadRangeToByteArray(CloudFile file, int fileSize, int bufferSize, int bufferOffset, long? fileOffset, long? length, int option) { int downloadLength; byte[] buffer = GetRandomBuffer(fileSize); byte[] resultBuffer = new byte[bufferSize]; byte[] resultBuffer2 = new byte[bufferSize]; using (MemoryStream originalFile = new MemoryStream(buffer)) { if (option == 0) { file.UploadFromStream(originalFile); downloadLength = file.DownloadRangeToByteArray(resultBuffer, bufferOffset, fileOffset, length); } else if (option == 1) { using (AutoResetEvent waitHandle = new AutoResetEvent(false)) { ICancellableAsyncResult result = file.BeginUploadFromStream(originalFile, ar => waitHandle.Set(), null); waitHandle.WaitOne(); file.EndUploadFromStream(result); result = file.BeginDownloadRangeToByteArray(resultBuffer, bufferOffset, fileOffset, length, ar => waitHandle.Set(), null); waitHandle.WaitOne(); downloadLength = file.EndDownloadRangeToByteArray(result); } } else { using (AutoResetEvent waitHandle = new AutoResetEvent(false)) { ICancellableAsyncResult result = file.BeginUploadFromStream(originalFile, ar => waitHandle.Set(), null); waitHandle.WaitOne(); file.EndUploadFromStream(result); OperationContext context = new OperationContext(); result = file.BeginDownloadRangeToByteArray(resultBuffer, bufferOffset, fileOffset, length, null, null, context, ar => waitHandle.Set(), null); waitHandle.WaitOne(); downloadLength = file.EndDownloadRangeToByteArray(result); } } int downloadSize = Math.Min(fileSize - (int)(fileOffset.HasValue ? fileOffset.Value : 0), bufferSize - bufferOffset); if (length.HasValue && (length.Value < downloadSize)) { downloadSize = (int)length.Value; } Assert.AreEqual(downloadSize, downloadLength); for (int i = 0; i < bufferOffset; i++) { Assert.AreEqual(0, resultBuffer[i]); } for (int j = 0; j < downloadLength; j++) { Assert.AreEqual(buffer[(fileOffset.HasValue ? fileOffset.Value : 0) + j], resultBuffer[bufferOffset + j]); } for (int k = bufferOffset + downloadLength; k < bufferSize; k++) { Assert.AreEqual(0, resultBuffer[k]); } } }
/// <summary> /// Single put file and get file /// </summary> /// <param name="fileSize">The file size.</param> /// <param name="bufferOffset">The file offset.</param> /// <param name="option"> 0 - Sunc, 1 - APM and 2 - APM overload.</param> private void DoDownloadToByteArrayTest(CloudFile file, int fileSize, int bufferSize, int bufferOffset, int option) { int downloadLength; byte[] buffer = GetRandomBuffer(fileSize); byte[] resultBuffer = new byte[bufferSize]; byte[] resultBuffer2 = new byte[bufferSize]; using (MemoryStream originalFile = new MemoryStream(buffer)) { if (option == 0) { file.UploadFromStream(originalFile); downloadLength = file.DownloadToByteArray(resultBuffer, bufferOffset); } else if (option == 1) { using (AutoResetEvent waitHandle = new AutoResetEvent(false)) { ICancellableAsyncResult result = file.BeginUploadFromStream(originalFile, ar => waitHandle.Set(), null); waitHandle.WaitOne(); file.EndUploadFromStream(result); result = file.BeginDownloadToByteArray(resultBuffer, bufferOffset, ar => waitHandle.Set(), null); waitHandle.WaitOne(); downloadLength = file.EndDownloadToByteArray(result); } } else { using (AutoResetEvent waitHandle = new AutoResetEvent(false)) { ICancellableAsyncResult result = file.BeginUploadFromStream(originalFile, ar => waitHandle.Set(), null); waitHandle.WaitOne(); file.EndUploadFromStream(result); OperationContext context = new OperationContext(); result = file.BeginDownloadToByteArray(resultBuffer, bufferOffset, /* offset */ null, /* accessCondition */ null, /* options */ context, /* operationContext */ ar => waitHandle.Set(), null); waitHandle.WaitOne(); downloadLength = file.EndDownloadToByteArray(result); } } int downloadSize = Math.Min(fileSize, bufferSize - bufferOffset); Assert.AreEqual(downloadSize, downloadLength); for (int i = 0; i < file.Properties.Length; i++) { Assert.AreEqual(buffer[i], resultBuffer[bufferOffset + i]); } for (int j = 0; j < bufferOffset; j++) { Assert.AreEqual(0, resultBuffer2[j]); } if (bufferOffset + fileSize < bufferSize) { for (int k = bufferOffset + fileSize; k < bufferSize; k++) { Assert.AreEqual(0, resultBuffer2[k]); } } } }
public void CloudFileDownloadToStreamAPMRetry() { byte[] buffer = GetRandomBuffer(1 * 1024 * 1024); CloudFileShare share = GetRandomShareReference(); try { share.Create(); CloudFile file = share.GetRootDirectoryReference().GetFileReference("file1"); using (MemoryStream originalFile = new MemoryStream(buffer)) { using (AutoResetEvent waitHandle = new AutoResetEvent(false)) { ICancellableAsyncResult result = file.BeginUploadFromStream(originalFile, ar => waitHandle.Set(), null); waitHandle.WaitOne(); file.EndUploadFromStream(result); using (MemoryStream downloadedFile = new MemoryStream()) { Exception manglerEx = null; using (HttpMangler proxy = new HttpMangler(false, new[] { TamperBehaviors.TamperNRequestsIf( session => ThreadPool.QueueUserWorkItem(state => { Thread.Sleep(1000); try { session.Abort(); } catch (Exception e) { manglerEx = e; } }), 2, AzureStorageSelectors.FileTraffic().IfHostNameContains(share.ServiceClient.Credentials.AccountName)) })) { OperationContext operationContext = new OperationContext(); result = file.BeginDownloadToStream(downloadedFile, null, null, operationContext, ar => waitHandle.Set(), null); waitHandle.WaitOne(); file.EndDownloadToStream(result); TestHelper.AssertStreamsAreEqual(originalFile, downloadedFile); } if (manglerEx != null) { throw manglerEx; } } } } } finally { share.DeleteIfExists(); } }