Recently I experienced an issue in which the following code was not able to generate a URI that is suitable for use as a URL in web transactions. You might have seen no problem at all using Uri.ToString() however the same code sometimes failed to generate an URL which can be used properly:


 var storageCredentialsAccountAndKey = new StorageCredentialsAccountAndKey(
"your_storage_name",
"your_storage_key");

var cloudBlobClient = new CloudBlobClient(
"https://your_storage_url",
storageCredentialsAccountAndKey);

var uri = "https://your_storage_url/container_name/blob_name.extension";
var cloudBlob = cloudBlobClient.GetBlobReference(uri);
var sas = cloudBlob.GetSharedAccessSignature(
new SharedAccessPolicy
{
Permissions = SharedAccessPermissions.Read,
SharedAccessStartTime = DateTime.Parse("Date_Time_Value"),
SharedAccessExpiryTime = DateTime.Parse("Date_Time_Value"),
});

Console.WriteLine(sas);
var uriValue = new Uri(uri + sas);
Console.WriteLine(uriValue.ToString());

What I found is that same CloudBlob.GetSharedAccessSignature() function was not able to encode the signature part of the string correctly if the signature has '+' in it. The same code does work fine sometime.

 

Conclusion:

Uri.AbsoluteUri() is almost always a better choice. Uri.ToString() produces something like a human-readable version of the URI. So if you are using Uri.AbsoluteUri that is the best decision to use and the best choice.

GetSharedAccessSignature() returns you a string so when you have “+” sign in your url, probably the right thing to do with it is to combine it with something and new Uri() it. The new Uri() would encode the string correctly.