Не может установить некоторые HTTP-заголовки при использовании Системы. Сеть. WebRequest

Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  1. Вызов метода экземпляра объекта null.
  2. Доступ или изменение поля объекта null.
  3. Принимая длину null, как если бы это был массив.
  4. Доступ или изменение слотов null, как если бы это был массив.
  5. Бросок null как будто это было значение Throwable.

Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null.

Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html

126
задан Vince Panuccio 21 February 2013 в 12:04
поделиться

5 ответов

Каждый раз, когда Вы изменяете заголовки HttpWebRequest, необходимо использовать соответствующие свойства на самом объекте, если они существуют. Если у Вас есть плоскость WebRequest, несомненно, бросят его к HttpWebRequest сначала. Затем Referrer в Вашем случае может быть получен доступ через ((HttpWebRequest)request).Referrer, таким образом, Вы не должны изменять заголовок непосредственно - просто устанавливает свойство на правильное значение. ContentLength, ContentType, UserAgent, и т.д., вся потребность, которая будет установлена этот путь.

, по моему скромному мнению, это - недостаток на части MS... устанавливающей заголовки через Headers.Add(), должен автоматически назвать соответствующее свойство негласно, если это - то, что они хотят сделать.

12
ответ дан 24 November 2019 в 00:50
поделиться

WebRequest, являющийся абстрактным (и так как любой наследующий класс должен переопределить свойство Headers).. который конкретный WebRequest Вы используете? Другими словами, как Вы получаете тот объект WebRequest к тому, чтобы быть с?

ehr.. ответ mnour заставил меня понять, что сообщение об ошибке, которое Вы получали, является на самом деле пятном на: это говорит Вам, что заголовок, который Вы пытаетесь добавить уже, существует, и необходимо затем изменить его значение с помощью соответствующего свойства (индексатор, например), вместо того, чтобы пытаться добавить его снова. Это - вероятно, все, что Вы искали.

Другие классы, наследовавшиеся WebRequest, могли бы иметь еще лучшие свойства, переносящие определенные заголовки; См. это сообщение , например.

7
ответ дан 24 November 2019 в 00:50
поделиться

В основном, нет. Это - http заголовок, таким образом, разумно бросить к HttpWebRequest и установить .Referer (как Вы указываете в вопросе):

HttpWebRequest req = ...
req.Referer = "your url";
1
ответ дан 24 November 2019 в 00:50
поделиться

При рассмотрении исходного кода WebHeaderCollection.cs, Вы будете видеть, что Hinfo используется, чтобы хранить информацию всех известных заголовков:

private static readonly HeaderInfoTable HInfo = new HeaderInfoTable();

Рассмотрение класса HeaderInfoTable, можно заметить, что все данные хранятся в хэш-таблицу

private static Hashtable HeaderHashTable;

Далее в статическом конструкторе HeaderInfoTable, Вы видите, что все известные заголовки добавляются в HeaderInfo [] и затем копируются в хеш-таблицу.

Заключительный взгляд на класс HeaderInfo показывает, что названия свойств

internal class HeaderInfo {

    internal readonly bool IsRequestRestricted;
    internal readonly bool IsResponseRestricted;
    internal readonly HeaderParser Parser;

    //
    // Note that the HeaderName field is not always valid, and should not
    // be used after initialization. In particular, the HeaderInfo returned
    // for an unknown header will not have the correct header name.
    //

    internal readonly string HeaderName;
    internal readonly bool AllowMultiValues;
    ...
    }

Так, со всем вышеупомянутым, вот являются кодом, который использует отражение для нахождения статической Хеш-таблицы в классе HeaderInfoTable и затем изменяется, каждый запрос защитил HeaderInfo внутри для снятия защиты.

        // use reflection to remove IsRequestRestricted from headerInfo hash table
        Assembly a = typeof(HttpWebRequest).Assembly;
        foreach (FieldInfo f in a.GetType("System.Net.HeaderInfoTable").GetFields(BindingFlags.NonPublic | BindingFlags.Static))
        {
            if (f.Name == "HeaderHashTable")
            {
                Hashtable hashTable = f.GetValue(null) as Hashtable;
                foreach (string sKey in hashTable.Keys)
                {

                    object headerInfo = hashTable[sKey];
                    //Console.WriteLine(String.Format("{0}: {1}", sKey, hashTable[sKey]));
                    foreach (FieldInfo g in a.GetType("System.Net.HeaderInfo").GetFields(BindingFlags.NonPublic | BindingFlags.Instance))
                    {

                        if (g.Name == "IsRequestRestricted")
                        {
                            bool b = (bool)g.GetValue(headerInfo);
                            if (b)
                            {
                                g.SetValue(headerInfo, false);
                                Console.WriteLine(sKey + "." + g.Name + " changed to false");
                            }

                        }
                    }

                }
            }
        } 
1
ответ дан 24 November 2019 в 00:50
поделиться

Я столкнулся с этой проблемой с помощью специального веб-клиента. Я думаю, что люди могут запутаться из-за множества способов сделать это. При использовании WebRequest.Create () вы можете выполнить приведение к HttpWebRequest и использовать свойство для добавления или изменения заголовка. При использовании WebHeaderCollection вы можете использовать .Add ("referer", "my_url") .

Пример 1

WebClient client = new WebClient();
client.Headers.Add("referer", "http://stackoverflow.com");
client.Headers.Add("user-agent", "Mozilla/5.0");

Пример 2

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Referer = "http://stackoverflow.com";
request.UserAgent = "Mozilla/5.0";
response = (HttpWebResponse)request.GetResponse();
74
ответ дан 24 November 2019 в 00:50
поделиться
Другие вопросы по тегам:

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