2015-09-01 9 views
0

Я тестирую приложение веб-сервиса, которое я написал на C# (Visual Studio 2015) на сервере Windows 2003. Приложение работает хорошо, но когда я запускаю строку кода:HttpWebRequest.GetResponse() throws untrappable error

WebResponse webResponse = request.GetResponse(); 

где запрос экземпляр HttpWebRequest, приложение выдает «ссылка на объект не указывает на экземпляр объекта.»

Прежде чем все скажут мне, чтобы я исследовал эту ошибку, у меня есть. Здесь нет смысла. HttpWebRequest, конечно, не является нулевым, я могу получить доступ к его свойствам, таким как URL и UserAgent, перед сбоем программы. Еще более странно, этот код завернут в файл try..catch, который ловушки как для веб-исключений, так и для общих исключений. Я понятия не имею, почему это не улавливает это.

Но причина этого в том, что если я попробую URL-адрес в Internet Explorer (версия 8.0 на этом старом сервере), я получаю сообщение об ошибке «Internet Explorer не может отображать веб-страницу». Я даже не могу войти на сайт, к которому я хочу получить доступ. Firefox отлично работает, но я не знаю, как заставить HttpWebRequest «быть» Firefox (UserAgent установлен на стандартную строку Mozilla ...).

Если слой веб-запроса на этом старом сервере просто не работает (например, версия .NET 3.5), это нормально. Но я хотел бы уловить ошибку. Почему мой try..catch не работает, и кто-нибудь знает, что сделает этот очень простой код (который работает повсюду), выбросит ошибку нулевого объекта?

Заранее благодарим за любое понимание, которое может предложить любой человек - очень благодарен!

ДОПОЛНИТЕЛЬНО: Вот весь try..catch:

try 
    { 
     HttpWebRequest request = GenerateWebRequest(pcMethodName, pcCommand, pcHTTPMethod); 
     MessageBox.Show(request.RequestUri.ToString()); 
     WebResponse webResponse = request.GetResponse(); 
     MessageBox.Show("The above line worked!"); 
     StreamReader reader = new StreamReader(webResponse.GetResponseStream()); 
     lcResult = reader.ReadToEnd(); 
    } 
    catch (WebException wex) 
    { 
     lcResult = "ERROR (web exception): " + Environment.NewLine + new StreamReader(wex.Response.GetResponseStream()).ReadToEnd(); 
    } 
    catch (Exception ex) 
    { 
     lcResult = "ERROR (general exception): " + Environment.NewLine + ex.Message; 
    } 

В случае, если не окончательный улов ловушкой какие-либо общие исключения? Чтобы быть ясным, ошибка, которую я вижу, находится в режиме RUN-TIME - я не могу отлаживать этот компьютер, потому что на нем нет Visual Studio (и это не вариант). Итак, я понятия не имею, что думает этот процесс. Как я могу это узнать? Поэтому я знаю линию:

WebResponse webResponse = request.GetResponse(); 

проблема в том, что я ставлю MessageBoxes между каждой строкой, пока я не обнаружил, что линия взрывал. Помещает ли версия «отладки» exe в игру предлагать дополнительную информацию об отладке при сбое приложения? (ПРИМЕЧАНИЕ. Отладочная версия EXE не предлагает больше информации, и я не могу добавить NullReferenceException, потому что компилятор говорит, что предыдущие «уловки» уже ловушки для этого ... пока это не так.).

+0

Можете ли вы опубликовать свой try..catch? Если вы ловите «исключения в Интернете и общие исключения», вы ловите NullReferenceExceptions? Также, когда вы поймаете веб-представление, вы выкачали ответ, что сервер говорит вам? – garyamorris

+0

Что такое VS, говорящий вам, что null? –

+0

И общий улов за «Исключение» поймает NRE @garyamorris. Если я не понял ваш комментарий –

ответ

0

Ответ: Я идиот.

Исключение было в ловушке, он пошел в WebException ветвь, а затем ошибочный в там, потому что в этом обработчике Старается:

lcResult = "ERROR (web exception): " + Environment.NewLine + new StreamReader(wex.Response.GetResponseStream()).ReadToEnd(); 

Это не так хорошо работает, когда wex.Response равна нулю , И в этом случае это null, потому что запрос не установил соединение в первую очередь.

Более надежный обработчик ошибок может либо вставить еще один try..catch, чтобы поймать любые дополнительные ошибки, либо просто убедиться, что вы будете использовать в обработчике, всегда будет работать. Я изменил свой обработчик WebException к этому:

catch (WebException wex) 
    { 
     if (wex.Response != null) 
     { 
      lcResult = "ERROR (web exception, response generated): " + Environment.NewLine + new StreamReader(wex.Response.GetResponseStream()).ReadToEnd(); 
     } 
     else 
     { 
      lcResult = "ERROR (web exception, NO RESPONSE): " + wex.Message + wex.StackTrace; 
     } 
    } 

и, наконец, получил значимую ошибку:

Базового соединение закрыто: Не удался установить доверительные отношения для SSL/TLS защищенного канала.

Таким образом, он никогда не получал связи в первую очередь, поэтому ответа не было. Это связано с тем, что старый IE не поддерживает HTTPS для этого веб-сайта. Как быстро и грязный исправить, чтобы проверить, если бы это было так, я добавил все остальные случаи:

System.NetServicePointManager.ServerCertificateValidationCallback = delegate { return true; }; 

и БАМ! все сработало. Я не оставлю это там, так как это не безопасно, но это устранило проблему.

Таким образом, ошибка была ловушкой (фактически оказалась в ловушке!), И я понял, почему проблема возникла в первую очередь. Спасибо всем за помощь!

0

Запрос не должен быть нулевым. WebRequest.Create() должен соответствовать вашему RequestURI и возвращать следующую ошибку: Invalid URI: The format of the URI could not be determined. Однако я видел другие примеры, когда люди обходили это как «https://helloworld.comFoo/Bar.html».

Удаленное имя RequestUri может быть неправильным, и вы должны его протестировать перед вызовом webRequest.GetResponse(). Метод WebRequest.Create() не проверяет этот 100%.

+0

Я не уверен, что вы подразумеваете под этим. Как я могу проверить RequestURI, точно? В моей программе у меня есть сообщение, отображающее URL-адрес прямо перед строкой, из-за которой выходят ошибки (это ошибка во время выполнения - я не могу ее отладить), и URL-адрес выглядит нормально. Фактически, URL-адрес также сохраняется в текстовом поле, и затем я могу скопировать и вставить URL-адрес в Firefox - и он отлично работает. – sutekh137