Так ведет себя внутренний код .NET - в предыдущих версиях вы могли использовать другой конструктор Uri
, который принимал логическое значение, указывающее, следует ли экранировать или нет, но он устарел.
Единственный способ обойти это - хакерство: прямой доступ к частному методу с помощью рефлексии:
string url = "http://www.example.com/default.aspx?id=1&name=andreas&options=one%3d1%26two%3d2%26three%3d3";
Uri uri = new Uri(url);
MethodInfo mi = uri.GetType().GetMethod("CreateThis", BindingFlags.NonPublic | BindingFlags.Instance);
if (mi != null)
mi.Invoke(uri, new object[] { url, true, UriKind.RelativeOrAbsolute });
Это сработало для меня в быстром тестировании, но не идеально, если вы взломали внутренний код .NET.