Кодирование фактического значения заголовка для HttpRequestMessage [duplicate]

Ну, простыми словами:

Вы пытаетесь получить доступ к объекту, который не создан или в настоящее время не находится в памяти.

Итак, как это решить:

  1. Отладить и отпустить отладчик ... Он сразу приведет вас к переменной, которая сломана ... Теперь ваша задача - просто исправить это. Используя новое ключевое слово в соответствующем месте.
  2. Если это вызвано некоторыми командами базы данных, потому что объект отсутствует, все, что вам нужно сделать, это выполнить нулевую проверку и обработать его:
    if (i == null) {
        // Handle this
    }
    
  3. Самый сложный. если GC уже собрал объект ... Это обычно происходит, если вы пытаетесь найти объект, используя строки ... То есть, найдя его по имени объекта, может случиться, что GC, возможно, уже очистил его ... Это трудно найти и станет проблемой. Лучшим способом решения этой проблемы является выполнение нулевых проверок везде, где это необходимо в процессе разработки. Это сэкономит вам много времени.

Поиск по имени означает, что некоторые фреймворки позволяют использовать FIndObjects с помощью строк, а код может выглядеть так: FindObject («ObjectName»);

11
задан antonio 4 May 2010 в 22:25
поделиться

5 ответов

Майеб Этот? Функция UrlEncode

-1
ответ дан Dani 28 August 2018 в 09:25
поделиться
  • 1
    Я ищу метод, который не выполняет кодировку, требуемую для URL-адреса, но просто рассматривает конкретные ограничения HTTP-заголовков – antonio 5 May 2010 в 02:05

Вы можете использовать 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.
  • Все остальные символы не закодированы.

Обновление:

Как указывает 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;
}

Just FYI

[здесь] ( https://github.com/mono/mono/ блоб / ведущий / MCS / класс / System.Web / System.Web.Util / HttpEncoder.cs )

9
ответ дан liuhongbo 28 August 2018 в 09:25
поделиться
  • 1
    HeaderNameValueEncode () защищен + внутренний. – Oliver Bock 12 December 2013 в 07:36
  • 2
    @OliverBock вы правы, обновили сообщение. – liuhongbo 12 December 2013 в 20:36
  • 3
    К сожалению, ни эта версия, ни версия .NET (видимая через Reflector) не хотят правильно кодировать символы «%» уже в данных. – Oliver Bock 12 December 2013 в 23:19

извините его за верхнюю часть моей головы, но для вашего объекта запроса должен быть объект заголовков, который вы можете добавить.

i.e. request.headers.add ("blah");

То, что не видно, но должно указывать на вас в правильном направлении.

-1
ответ дан Nick 28 August 2018 в 09:25
поделиться
  • 1
    Речь идет о кодировании значения заголовка, а не о добавлении заголовка. – Nikhil Dabas 8 June 2012 в 21:28

Выполняет то же самое задание, что и 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);
}
0
ответ дан Oliver Bock 28 August 2018 в 09:25
поделиться

Мне помогли Uri.EscapeDataString (headervalue)

3
ответ дан R.Titov 28 August 2018 в 09:25
поделиться
Другие вопросы по тегам:

Похожие вопросы: