Andreas
Andreas

Reputation: 1311

Strange behavior in Uri-class (.NET)

Why does the Uri class urldecode my url that I send to its contructor and how can I prevent this?

Example (look at the querystring value "options"):

    string url = "http://www.example.com/default.aspx?id=1&name=andreas&options=one%3d1%26two%3d2%26three%3d3";
    Uri uri = new Uri(url); // http://www.example.com/default.aspx?id=1&name=andreas&options=one=1&two=2&three=3

Update:

// ?id=1&name=andreas&options=one%3d1%26two%3d2%26three%3d3
Request.QueryString["options"] = one=1&two=2&three=3

// ?id=1&name=andreas&options=one=1&two=2&three=3
Request.QueryString["options"] = one=1

This is my problem :)

Upvotes: 2

Views: 812

Answers (3)

Shadow Wizard
Shadow Wizard

Reputation: 66389

This is how the internal code of .NET behaves - in previous versions you could use another constructor of Uri that accepted boolean value telling if to escape or not, but it has been deprecated.

The only way around it is hackish: accessing some private method directly by means of reflection:

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  });

This worked for me in quick test, but not ideal as you "hack" into .NET internal code.

Upvotes: 0

esskar
esskar

Reputation: 10940

why exactly? you can get to the encoded version using url.AbsoluteUri

EDIT

Console.WriteLine("1) " + uri.AbsoluteUri);
Console.WriteLine("2) " + uri.Query);

OUT:
1) http://www.example.com/default.aspx?id=1&name=andreas&options=one%3d1%26two%3d2%26three%3d3
2) ?id=1&name=andreas&options=one%3d1%26two%3d2%26three%3d3

Upvotes: 1

Michal B.
Michal B.

Reputation: 5719

I would expect that from a Uri class. I am quite sure that it still gets you in a good place if you use it with e.g. WebClient class (i.e. WebClient.OpenRead (Uri uri)). What's the problem in your case?

Upvotes: 0

Related Questions