Upload blobs using UploadFromStream to Azure Storage and using ResponseReceivedEventArgs to track the upload progress

While uploading a stream of various sizes using UploadFromStream, and using ResponseReceivedEventArgs to track the HTTPStatusCode you will see the following behavior:

1)     For a blob whose size less than(or equal to)32 MB, the lib will send it in one piece

2)     For a blob whose size is bigger than 32 MB, the lib will chuck it into blocks(Max size is 4MB) to send.


After spending some time I was able to get ResponseReceivedEventArgs to track how much data have been uploaded. The code snippet is as below:


using System;

using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;
using System.Diagnostics;
using System.Data.Services.Common;
using System.IO;
using System.Net;
using System.Security.Cryptography.X509Certificates;
using System.Net.Security;
using System.Threading;

namespace ConsoleApplication1
class Program
static void Main(string[] args)
string accountSettings = "";
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(accountSettings);
CloudBlobClient blobStorage = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobStorage.GetContainerReference("test");
string blobName = "testBlob";
var blob = container.GetBlockBlobReference(blobName);
MemoryStream randomDataForPut = RandomData(33*1024*1024);
long totalBytes = 0;
blobStorage.ResponseReceived += new EventHandler<ResponseReceivedEventArgs>((obj, responseReceivedEventArgs)
if (responseReceivedEventArgs.RequestUri.ToString().Contains("comp=block&blockid"))
totalBytes += Int64.Parse(responseReceivedEventArgs.RequestHeaders["Content-Length"]);

catch (Exception e)

public static MemoryStream RandomData(long length)
var result = new MemoryStream();
Random r = new Random();
for (long i = 0; i < length; i++)
result.Position = 0;
return result;
Comments (0)