Буквальный запрос Uri - PullRequest
       8

Буквальный запрос Uri

3 голосов
/ 13 января 2012

Я видел несколько постов, в которых говорится об использовании несоответствующего Uris, но ни один из них не дал хорошего ответа.Я пишу элемент управления Windows Phone, и он должен запрашивать данные ATOM с помощью HTTP GET.URL должен содержать символы% 3d (знак равенства).Это не подлежит обсуждению, поскольку это сторонний сервис, который я не могу контролировать.Представьте себе URL-адрес, подобный следующему:

http://host.com? Arg1 = val1 & arg = val2% 3d

Я использую WebClient с DownloadStringAsync, но он принимает только объекты Uri, а не URL в строках.Объект Uri автоматически экранирует эти символы и отправляет:

http://host.com? Arg1 = val1 & arg = val2 =

Это не удалось.Есть устаревший аргумент конструктора «UserExcaped», который мне нужен, но он недоступен.Я боюсь, что мой единственный вариант - реализовать собственный метод загрузки строк с использованием необработанного сокета и минимальной поддержки HTTP.

Есть еще мысли?Помощь очень ценится !!

ОБНОВЛЕНИЕ <pre><code> string apps = "http://blah.com/api?prev=AAAAAAA%3d&next=BBBBBBB"; var u = new Uri(apps); string apps2 = u.ToString(); Debug.Assert(apps == apps2); // That %3d will always be converted to an equals sign

Я также должен отметить, что если я попытаюсь быть умным с помощью кодированияпроцент как% 25 (так что «prev = AAAAAA% 253d & next = BBBBB»), тогда я получаю точную буквенную строку с% 25 до сих пор нетронутым!Это просто% 3d, что агрессивно настроен на преобразование в знак равенства.

Ответы [ 2 ]

1 голос
/ 14 января 2012

Класс Uri разработан таким образом. MSDN :

В рамках канонизации в конструкторе для некоторых схем экранированные представления уплотняются.Схемы, для которых URI будет уплотнять экранированные последовательности, включают следующее: file, http , https, net.pipe и net.tcp.Для всех других схем экранированные последовательности не уплотняются.

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

Редактировать - другим подходом может быть создание собственного UriParser, который допускает кодированную версию.Пример расширения UriParser может быть , найденный здесь .

Для других не под управлением Windows Phone, вы можете использовать reflection, чтобы это исправить.

MethodInfo getSyntax = typeof(UriParser).GetMethod("GetSyntax", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic);
FieldInfo flagsField = typeof(UriParser).GetField("m_Flags", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
if (getSyntax != null && flagsField != null)
{
   foreach (string scheme in new[] { "http", "https" })
   {

       UriParser parser = (UriParser)getSyntax.Invoke(null, new object[] { scheme });
       if (parser != null)
       {
           int flagsValue = (int)flagsField.GetValue(parser);

           //0x20000 is the SimpleUserSyntax attribute
           if ((flagsValue & 0x20000) != 0)
              flagsField.SetValue(parser, flagsValue & ~0x20000);
       }
    }
}


Uri u = new Uri("http://host.com?arg1=val&arg=val2%3d");
//At this point, the %3d remains as expected.
0 голосов
/ 14 января 2012

Попробуйте использовать Гамак - вы должны иметь возможность дать ему строку, а не Uri.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...