2012-01-13 2 views
3

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

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

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

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

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

Любые другие мысли? Помощь очень ценится !!

UPDATE

 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 (так что "пред = AAAAAA% 253d & следующая = BBBBB"), то я получите точную литеральную строку с% 25, ​​все еще неповрежденной! Это просто% 3d, что агрессивно относится к конвертации в знак равенства.

+0

есть способ, который можно установить на страницах страницу ResponseEncoding = «ISO-8859-1», это звучит как вопрос кодирования – MethodMan

+0

Вы пробовали с помощью HttpUtility.UrlEncode или HttpUtility.UrlDecode, и т.д ..? Я определенно попал на серверы с закодированными параметрами, но вместо этого использовал HttpWebRequest. –

+0

Хммм ... Я добавил пример на мой вопрос. Как только вы попытаетесь создать URI, это испортит его. –

ответ

1

Класс Uri предназначен для этого. MSDN:

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

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

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

Для других нет под управлением 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

Я не вижу, что ... HttpWebRequest (по крайней мере, на Windows Phone) использует свойство RequestUri, которое не является строковым ... –

+0

@ArianKulp - Инициировать WebRequest: http://msdn.microsoft.com/en- us/library/bw00b1dc% 28v = vs.95% 29.aspx – keyboardP

+0

Так что я просто попробовал это. Он принимает строку, но он, по-видимому, просто конструирует объект Uri внутри, так как он выполняет одно и то же экранирование. Argh! –

0

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

+0

Nice перспективных рамки. Я никогда не слышал об этом. Тем не менее, такая же проблема. –

Смежные вопросы