Странное поведение в Uri-классе (.NET) - PullRequest
2 голосов
/ 30 ноября 2011

Почему класс Uri кодирует мой URL, который я отправляю его конструктору, и как я могу предотвратить это?

Пример (посмотрите значение строки запроса "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

Обновление:

// ?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

Это моя проблема :)

Ответы [ 3 ]

1 голос
/ 30 ноября 2011

почему именно? Вы можете перейти к закодированной версии, используя 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
0 голосов
/ 30 ноября 2011

Так ведет себя внутренний код .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.

0 голосов
/ 30 ноября 2011

Я ожидал бы этого от класса Ури.Я совершенно уверен, что он все равно поможет вам, если вы будете использовать его, например, с классом WebClient (т.е.В чем проблема в вашем случае?

...