我正在测试我在Windows 2003服务器上用C#(Visual Studio 2015)编写的Web服务应用程序。应用程序运行正常,但是当我运行代码行时:
WebResponse webResponse = request.GetResponse();
其中request是HttpWebRequest实例,应用程序抛出“未将对象引用设置为对象的实例。”
在每个人都告诉我去研究这个错误之前,我有。这里没有意义。 HttpWebRequest当然不是null,我可以在程序崩溃之前访问它的URL和UserAgent等属性。更奇怪的是,此代码包含在 try..catch 中,用于捕获Web异常和一般异常。我不知道为什么它没有陷阱。
但它发生的原因是因为如果我在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 :(得分:1)
答案是......我是个白痴。
WAS被捕获的异常,它转到WebException分支,然后在那里出错,因为在那个处理程序中我尝试:
lcResult = "ERROR (web exception): " + Environment.NewLine + new StreamReader(wex.Response.GetResponseStream()).ReadToEnd();
当wex.Response为null时,这种方法效果不佳。在这种情况下它是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。作为检查是否是这种情况的快速和肮脏的修复,我添加了catch-all:
System.NetServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
和BAM!一切顺利。我不会把它留在那里,因为它不安全,但确实解决了这个问题。
所以,错误是可以捕获的(实际上被困了!)我想出了为什么问题首先出现了。感谢大家的帮助!
答案 1 :(得分:0)
请求不应为null。 WebRequest.Create()
应该符合您的RequestURI
资格,并会返回以下错误Invalid URI: The format of the URI could not be determined
。但是,我已经看到了其他一些人们已经围绕这个问题的例子,如#34; https://helloworld.comFoo/Bar.html"。
远程名称RequestUri
可能不正确,您应在调用webRequest.GetResponse()
之前对其进行测试。方法WebRequest.Create()
不会检查此100%。