Uri.ToString Must Die

If your code uses Uri.ToString, it’s probably a bug.

The Uri.ToString method is documented as returning the “unescaped canonical representation” of the URI. Put simply, this means it’s corrupted. Characters like + and & will become unescaped, which completely changes the meaning of the URI.

Say you want to use WolframAlpha to do some maths:

Uri uri = new Uri("https://www.wolframalpha.com/input/?i=1%2b1");

// WRONG! Returns https://www.wolframalpha.com/input/?i=1+1

uri.ToString();

// Correct! Returns https://www.wolframalpha.com/input/?i=1%2b1

uri.AbsoluteUri;

Or say you want to learn a new language:

Uri uri = new Uri("https://www.google.com/search?q=K%26R");

// WRONG! Returns https://www.google.com/search?q=K&R

uri.ToString();

// Correct! Returns https://www.google.com/search?q=K%26R

uri.AbsoluteUri;

My preference is to use Uri.AbsoluteUri, but that will fail if the URI is relative. In that case, you can use Uri.OriginalString, which simply returns the original string passed to the Uri constructor. Unfortunately, this causes you to lose the small amount of escaping of invalid URIs and canonicalization that the Uri class does perform, so you should ensure your original string is already correctly URL-encoded.

Posted by Bradley Grainger on August 20, 2010