2015-09-01 40 views
0

我正在测试我在Windows 2003服务器上的C#(Visual Studio 2015)中编写的Web服务应用程序。该应用程序运行良好,但是当我运行的代码行:“未设置为一个对象的实例对象引用”HttpWebRequest.GetResponse()抛出untrappable错误

WebResponse webResponse = request.GetResponse(); 

其中请求是HttpWebRequest的情况下,应用程序将引发

在大家告诉我去研究那个错误之前,我有。这里没有意义。 HttpWebRequest当然不是null,我可以在程序崩溃之前访问它的属性,如URL和UserAgent。更奇怪的是,这段代码被封装在一个try..catch中,用于捕获网络异常和一般异常。我不知道为什么它没有陷入这个问题。

但是它发生的原因是因为如果我在Internet Explorer(这个旧服务器上的版本8.0)尝试URL,我得到一个“Internet Explorer无法显示网页”的错误。我甚至无法登录到我希望访问的网站。 Firefox工作正常,但我不知道如何强制HttpWebRequest“成为”Firefox(已将UserAgent设置为标准Mozilla字符串...)。

如果这个旧服务器上的Web请求层不起作用(顺便说一下.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(); 

的问题是因为我把每一行之间的消息框,直到我发现了什么系炸毁。在应用程序崩溃时,将“调试”版本的exe放在播放器中会提供更多的调试信息吗? (注意:调试版本的EXE似乎没有提供任何更多的信息,而且我也不能添加NullReferenceException,因为编译器说前面的“catch”已经陷入了这个陷阱......但它却没有。)。

+0

你可以发布你的try..catch?如果你捕捉到“网络异常和一般异常”,你是否会捕获NullReferenceExceptions? 另外,当你抓住webexception你有没有抽出回应,服务器告诉你什么? – garyamorris

+0

什么是VS告诉你是空的? –

+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; }; 

和BAM!一切正常。我不会把它留在那里,因为它不安全,但它确实解决了这个问题。

所以,这个错误是可以被捕获的(事实上被困住了!),我想出了为什么问题出现在第一位。感谢大家的帮助!

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