Я понимаю, что создание веб-запросов довольно хорошо поддерживается в Portable Class Library. Есть ли эквивалент HttpUtility.UrlEncode в PCL? Мне это нужно для приложений Windows Phone и Metro.
Портативная библиотека классов HttpUtility.UrlEncode
Ответ 1
WebUtility
В портативных библиотеках классов, которым посчастливилось ориентироваться на .NET 4.5 (например, Profile7), многие из методов HttpUtility имеют братья и сестры в System.Net.WebUtility
.
using System.Net;
WebUtility.UrlEncode("some?string#");
Потенциальное предупреждение
В то время как некоторые из методов брата, похоже, идентичны своим коллегам HttpUtility, у этого есть небольшая разница между результирующими кодировками. WebUtility.UrlEncode
генерирует кодировки верхнего регистра, а HttpUtility.UrlEncode
генерирует строчные кодировки.
WebUtility.UrlEncode("?") // -> "%3F"
HttpUtility.UrlEncode("?") // -> "%3f"
Сделать его обратно совместимым
Если вы зависите от своего кода PCL, генерирующего именно то, что вы бы сгенерировали с помощью предыдущего кода HttpUtility, вы могли бы создать свой собственный вспомогательный метод вокруг этого метода и повторно использовать его.
using System.Text.RegularExpressions;
public static string UrlEncodeOldSchool(string value) {
var encodedValue = WebUtility.UrlEncode(value);
return Regex.Replace(encodedValue, "(%[0-9A-F]{2})",
encodedChar => encodedChar.Value.ToLowerInvariant());
}
(Даже если это простой, всегда регулярное выражение на свой страх и риск.)
Ответ 2
Используйте Uri.EscapeUriString
и Uri.EscapeDataString
Единственное различие между ними состоит в том, что EscapeDataString
также кодирует зарезервированные символы RFC 2396, которые включают в себя эти символы ;/?:@&=+$
,
Важно отметить, что ни один из этих методов не кодирует незарезервированные символы RFC 2396, которые включают -_.!~*'()
Поэтому, если вам нужны эти кодировки, вам придется их вручную закодировать.