Существует ли класс, подобный HttpUtility, для кодирования содержимого пользовательского заголовка? В идеале я хотел бы, чтобы содержимое было читаемым.
Как закодировать пользовательские заголовки HTTP в С#
Ответ 1
Вы можете использовать HttpEncoder.HeaderNameValueEncode Method в .NET Framework 4.0 и выше.
Для предыдущих версий .NET Framework вы можете свернуть собственный кодер, используя логику, указанную на странице справки HttpEncoder.HeaderNameValueEncode:
-
Все символы, значение Unicode которых меньше ASCII-символа 32, кроме символа ASCII 9, кодируются URL-адресами в формате% NN, где N символов представляют шестнадцатеричные значения.
-
Символ ASCII 9 (символ горизонтальной вкладки) не кодируется URL.
-
Символ ASCII 127 кодируется как% 7F.
-
Все остальные символы не закодированы.
Update:
Как указывает OliverBock, метод HttpEncoder.HeaderNameValueEncode защищен и внутренне. Я пошел в проект с открытым исходным кодом Mono и нашел моно-реализацию
void HeaderNameValueEncode (string headerName, string headerValue, out string encodedHeaderName, out string encodedHeaderValue)
{
if (String.IsNullOrEmpty (headerName))
encodedHeaderName = headerName;
else
encodedHeaderName = EncodeHeaderString (headerName);
if (String.IsNullOrEmpty (headerValue))
encodedHeaderValue = headerValue;
else
encodedHeaderValue = EncodeHeaderString (headerValue);
}
static void StringBuilderAppend (string s, ref StringBuilder sb)
{
if (sb == null)
sb = new StringBuilder (s);
else
sb.Append (s);
}
static string EncodeHeaderString (string input)
{
StringBuilder sb = null;
for (int i = 0; i < input.Length; i++) {
char ch = input [i];
if ((ch < 32 && ch != 9) || ch == 127)
StringBuilderAppend (String.Format ("%{0:x2}", (int)ch), ref sb);
}
if (sb != null)
return sb.ToString ();
return input;
}
Просто FYI
[здесь] (https://github.com/mono/mono/blob/master/mcs/class/System.Web/System.Web.Util/HttpEncoder.cs)
Ответ 2
Мне помогли Uri.EscapeDataString(headervalue)
Ответ 3
Выполняет то же самое задание, что и HeaderNameValueEncode(), но также кодирует символы%, поэтому заголовок может быть надежно декодирован позже.
static string EncodeHeaderValue(string value)
{
return Regex.Replace(value, @"[\u0000-\u0008\u000a-\u001f%\u007f]", (m) => "%"+((int)m.Value[0]).ToString("x2"));
}
static string DecodeHeaderValue(string encoded)
{
return Regex.Replace(encoded, @"%([0-9a-f]{2})", (m) => new String((char)Convert.ToInt32(m.Groups[1].Value, 16), 1), RegexOptions.IgnoreCase);
}
Ответ 4
Майеб Этот? Функция UrlEncode
Ответ 5
извините его за верхнюю часть моей головы, но для вашего объекта запроса должен быть объект заголовков, который вы можете добавить.
то есть. request.headers.add( "бла" );
Thats not spot on, но он должен указывать на вас в правильном направлении.