Исключение нулевого указателя генерируется, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
null
. null
. null
, как если бы это был массив. null
, как если бы это был массив. null
как будто это было значение Throwable. Приложения должны бросать экземпляры этого класса, чтобы указать на другие незаконные использования объекта null
.
Ссылка: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
Каждый раз, когда Вы изменяете заголовки HttpWebRequest
, необходимо использовать соответствующие свойства на самом объекте, если они существуют. Если у Вас есть плоскость WebRequest
, несомненно, бросят его к HttpWebRequest
сначала. Затем Referrer
в Вашем случае может быть получен доступ через ((HttpWebRequest)request).Referrer
, таким образом, Вы не должны изменять заголовок непосредственно - просто устанавливает свойство на правильное значение. ContentLength
, ContentType
, UserAgent
, и т.д., вся потребность, которая будет установлена этот путь.
, по моему скромному мнению, это - недостаток на части MS... устанавливающей заголовки через Headers.Add()
, должен автоматически назвать соответствующее свойство негласно, если это - то, что они хотят сделать.
WebRequest, являющийся абстрактным (и так как любой наследующий класс должен переопределить свойство Headers).. который конкретный WebRequest Вы используете? Другими словами, как Вы получаете тот объект WebRequest к тому, чтобы быть с?
ehr.. ответ mnour заставил меня понять, что сообщение об ошибке, которое Вы получали, является на самом деле пятном на: это говорит Вам, что заголовок, который Вы пытаетесь добавить уже, существует, и необходимо затем изменить его значение с помощью соответствующего свойства (индексатор, например), вместо того, чтобы пытаться добавить его снова. Это - вероятно, все, что Вы искали.
Другие классы, наследовавшиеся WebRequest, могли бы иметь еще лучшие свойства, переносящие определенные заголовки; См. это сообщение , например.
В основном, нет. Это - http заголовок, таким образом, разумно бросить к HttpWebRequest
и установить .Referer
(как Вы указываете в вопросе):
HttpWebRequest req = ...
req.Referer = "your url";
При рассмотрении исходного кода 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");
}
}
}
}
}
}
Я столкнулся с этой проблемой с помощью специального веб-клиента. Я думаю, что люди могут запутаться из-за множества способов сделать это. При использовании 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();