private static void CreateForTest(CloudBlockBlob blob, int blockCount, int blockSize, bool isAsync, bool commit = true) { byte[] buffer = GetRandomBuffer(blockSize); List<string> blocks = GetBlockIdList(blockCount); using (AutoResetEvent waitHandle = new AutoResetEvent(false)) { foreach (string block in blocks) { using (MemoryStream stream = new MemoryStream(buffer)) { if (isAsync) { IAsyncResult result = blob.BeginPutBlock(block, stream, null, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blob.EndPutBlock(result); } else { blob.PutBlock(block, stream, null); } } } if (commit) { if (isAsync) { IAsyncResult result = blob.BeginPutBlockList(blocks, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blob.EndPutBlockList(result); } else { blob.PutBlockList(blocks); } } } }
public void UseTransactionalMD5PutTestAPM() { BlobRequestOptions optionsWithNoMD5 = new BlobRequestOptions() { UseTransactionalMD5 = false, }; BlobRequestOptions optionsWithMD5 = new BlobRequestOptions() { UseTransactionalMD5 = true, }; byte[] buffer = GetRandomBuffer(1024); MD5 hasher = MD5.Create(); string md5 = Convert.ToBase64String(hasher.ComputeHash(buffer)); string lastCheckMD5 = null; int checkCount = 0; OperationContext opContextWithMD5Check = new OperationContext(); opContextWithMD5Check.SendingRequest += (_, args) => { if (args.Request.ContentLength >= buffer.Length) { lastCheckMD5 = args.Request.Headers[HttpRequestHeader.ContentMd5]; checkCount++; } }; CloudBlobContainer container = GetRandomContainerReference(); try { container.Create(); using (AutoResetEvent waitHandle = new AutoResetEvent(false)) { IAsyncResult result; CloudBlockBlob blockBlob = container.GetBlockBlobReference("blob1"); List <string> blockIds = GetBlockIdList(3); checkCount = 0; using (Stream blockData = new MemoryStream(buffer)) { result = blockBlob.BeginPutBlock(blockIds[0], blockData, null, null, optionsWithNoMD5, opContextWithMD5Check, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blockBlob.EndPutBlock(result); Assert.IsNull(lastCheckMD5); blockData.Seek(0, SeekOrigin.Begin); result = blockBlob.BeginPutBlock(blockIds[1], blockData, null, null, optionsWithMD5, opContextWithMD5Check, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blockBlob.EndPutBlock(result); Assert.AreEqual(md5, lastCheckMD5); blockData.Seek(0, SeekOrigin.Begin); result = blockBlob.BeginPutBlock(blockIds[2], blockData, md5, null, optionsWithNoMD5, opContextWithMD5Check, ar => waitHandle.Set(), null); waitHandle.WaitOne(); blockBlob.EndPutBlock(result); Assert.AreEqual(md5, lastCheckMD5); } Assert.AreEqual(3, checkCount); CloudPageBlob pageBlob = container.GetPageBlobReference("blob2"); pageBlob.Create(buffer.Length); checkCount = 0; using (Stream pageData = new MemoryStream(buffer)) { result = pageBlob.BeginWritePages(pageData, 0, null, null, optionsWithNoMD5, opContextWithMD5Check, ar => waitHandle.Set(), null); waitHandle.WaitOne(); pageBlob.EndWritePages(result); Assert.IsNull(lastCheckMD5); pageData.Seek(0, SeekOrigin.Begin); result = pageBlob.BeginWritePages(pageData, 0, null, null, optionsWithMD5, opContextWithMD5Check, ar => waitHandle.Set(), null); waitHandle.WaitOne(); pageBlob.EndWritePages(result); Assert.AreEqual(md5, lastCheckMD5); pageData.Seek(0, SeekOrigin.Begin); result = pageBlob.BeginWritePages(pageData, 0, md5, null, optionsWithNoMD5, opContextWithMD5Check, ar => waitHandle.Set(), null); waitHandle.WaitOne(); pageBlob.EndWritePages(result); Assert.AreEqual(md5, lastCheckMD5); } Assert.AreEqual(3, checkCount); } } finally { container.DeleteIfExists(); } }