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.