2016-04-13 2 views
0

В моей программе C# я использую WebClient для загрузки строки, которая отлично работает в целом, но время от времени я получаю исключение »ссылка на объект не установлен в экземпляр объекта ".WebClient DownloadString иногда вызывает исключение «ссылка на объект, не установленное на экземпляр объекта»

Следующий пример показывает соответствующую часть кода:

String ResponseString = ""; 
String URITarget = "..... my URI information ....."; 

using (WebClient WebClientInstance = new WebClient()) 
{ 

    WebClientInstance.Encoding = System.Text.Encoding.UTF8; 
    WebClientInstance.Headers.Add("Content-Type", "application/json"); 

    ResponseString = WebClientInstance.DownloadString(URITarget); 

} 

Исключение происходит в этой строке кода:

ResponseString = WebClientInstance.DownloadString(URITarget); 

Как я использую темы и, следовательно, функцию с указанным кодом можно назвать теоретически в то же время из разных потоков. Сначала я думал, что проблема может быть вызвана потоками, поскольку WebClient не является потокобезопасным. Но после реализации блокировки (SendWebClientHTTPRequestThreadLock) вокруг кода выше, это не принесло никаких улучшений:

private Object SendWebClientHTTPRequestThreadLock = new Object(); 

... 


String ResponseString = ""; 
String URITarget = "..... my URI information ....."; 

lock (SendWebClientHTTPRequestThreadLock) 
{ 

    using (WebClient WebClientInstance = new WebClient()) 
    { 

     WebClientInstance.Encoding = System.Text.Encoding.UTF8; 
     WebClientInstance.Headers.Add("Content-Type", "application/json"); 

     ResponseString = WebClientInstance.DownloadString(URITarget); 

    } 

} 

Может ли быть, что WebClientInstance.DownloadString (URITarget) возвращает NULL по какой-то причине вместо фактической или по крайней мере, пустая строка ? Какие-либо предложения?

+1

Код как опубликованный не может вызывать 'NullReferenceException', кроме как где-то похоронен в реализации' DownloadString'. Пожалуйста, разместите всю трассировку стека и, желательно, дайте нам [минимальный, полный и проверяемый пример] (http://stackoverflow.com/help/mcve/), помимо того, что вы считаете релевантным. –

+0

Это не 'WebClientInstance.DownloadString (URITarget)', который возвращает NULL. Кажется, что 'WebClientInstance' сам по себе является' null', поэтому вы не можете вызвать какой-либо его метод. –

+0

Я добавил еще несколько логик в мое приложение, чтобы улучшить анализ проблемы. К сожалению (или, к счастью?), Проблема не появилась снова с прошлой недели. Я продолжаю следить за ситуацией и буду получать дополнительную информацию, как только это будет возможно. – Reboon

ответ

0

Тот факт, что ваш объект WebClientInstance обнуляется до завершения использования блока, является нечетным. Я предполагаю, что это может быть связано с проблемой ресурса или утечкой памяти в вашем приложении. Возможно, вы попадаете в пределы пула потоков, и из-за этого ваши потоки прерываются.

Я бы также попробовал неблокирующие методы WebClient, такие как WebClient.DownloadStringTaskAsync, и посмотреть, не изменилось ли это. Если это не решит проблему, я попытаюсь использовать TPL вместо необработанных потоков для безопасного управления пулами потоков.

+0

Это больше, чем * нечетное * - это по стандарту языка и всем практическим реализациям компилятора, * невозможно *. Если вызов конструктора не выбрасывается, результат будет нечеловеческим. SInce не присваивается переменной, она не может быть «null». Время выполнения не приведет к внезапному аннулированию переменных, независимо от того, что происходит с ресурсами. Мы можем заключить, что «объект« WebClientInstance »[получение] аннулирован» в высшей степени маловероятен. Скорее всего, OP не учитывает соответствующие детали. То, что вы предлагаете, догадываясь, это отладка дробовиков, которая почти никогда не работает. –

+0

Да, вы правы. Я просто любезно сослался на комментарий, который был опубликован как ответ на вас выше ... Проблема может быть что-то, конечно, но поскольку OP не может размещать здесь все приложение, мы должны принять итеративный подход и начать откуда-то или поднимите руки вверх в небе и отбросьте вопрос ... –

+0

Вы можете оставить комментарий в качестве ответа, если (и только если) у вас еще нет репутации, чтобы комментировать, но тогда это помогает, если вы четко укажете в тексте, что это то, что вы делаете. Попытка улучшить вопрос в порядке, но это не то, на что нужны ответы. –

0

Возможно, речь идет о проблеме безопасности. Некоторым хостам необходимо пройти аутентификацию, чтобы разрешить поток чтения. Проверьте удаленный сервер на наличие ошибок (403) Запрещено. В этом случае вам необходимо передать имя пользователя и пароль, чтобы получить доступ к файлу.

+0

Это может быть комментарий .. !! –

Смежные вопросы