HttpWebRequest.GetResponse() 抛出无法捕获的错误
HttpWebRequest.GetResponse() throws untrappable error
我正在 Windows 2003 服务器上测试我用 C# (Visual Studio 2015) 编写的 Web 服务应用程序。该应用程序 运行 很好,但是当我 运行 代码行时:
WebResponse webResponse = request.GetResponse();
其中请求是一个 HttpWebRequest 实例,应用程序抛出一个 "Object reference not set to an instance of an object."
在每个人都告诉我去研究那个错误之前,我已经做了。这里没有意义。 HttpWebRequest 肯定不为空,我可以在程序崩溃之前访问它的 URL 和 UserAgent 等属性。更奇怪的是,这段代码被包裹在一个 try..catch 中,它同时捕获 Web 异常和一般异常。我不知道为什么它不捕获这个。
但发生这种情况的原因是,如果我在 Internet Explorer(此旧服务器上的 8.0 版)中尝试 URL,我会收到 "Internet Explorer cannot display the web page" 错误。我什至无法登录我想访问的网站。 Firefox 工作正常,但我不知道如何将 HttpWebRequest 强制到 "be" 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;
}
最后的 catch 不应该捕获任何一般异常吗?需要明确的是,我看到的错误是在 运行-TIME——我无法在这台机器上调试,因为它上面没有 Visual Studio(这不是一个选项)。所以,我不知道这个过程认为什么是空的。我怎样才能找到它?我知道这条线的原因:
WebResponse webResponse = request.GetResponse();
问题是因为我在每行之间放置了消息框,直到我发现哪一行被炸毁了。当应用程序崩溃时,运行 "Debug" 版本的 exe 会提供更多调试信息吗? (注意:EXE 的调试版本似乎没有提供任何更多信息,而且我不能添加 NullReferenceException
,因为编译器说之前的 "catch" 已经为它设置了陷阱……但它没有。 ).
请求不能为空。 WebRequest.Create()
应该符合你的 RequestURI
并且会 return 出现以下错误 Invalid URI: The format of the URI could not be determined
。然而,我看到了其他例子,人们绕过了这个问题,比如“https://helloworld.comFoo/Bar.html”。
远程名称 RequestUri
可能不正确,您应该在调用 webRequest.GetResponse()
之前对其进行测试。方法 WebRequest.Create()
不会检查这个 100%。
答案是...我是个白痴
异常被捕获,它进入 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; };
砰!一切正常。我不会把它留在那儿,因为它不安全,但它确实解决了问题。
所以,错误是可以捕获的(实际上是被捕获了!),我首先弄清楚了为什么会出现这个问题。感谢大家的帮助!
我正在 Windows 2003 服务器上测试我用 C# (Visual Studio 2015) 编写的 Web 服务应用程序。该应用程序 运行 很好,但是当我 运行 代码行时:
WebResponse webResponse = request.GetResponse();
其中请求是一个 HttpWebRequest 实例,应用程序抛出一个 "Object reference not set to an instance of an object."
在每个人都告诉我去研究那个错误之前,我已经做了。这里没有意义。 HttpWebRequest 肯定不为空,我可以在程序崩溃之前访问它的 URL 和 UserAgent 等属性。更奇怪的是,这段代码被包裹在一个 try..catch 中,它同时捕获 Web 异常和一般异常。我不知道为什么它不捕获这个。
但发生这种情况的原因是,如果我在 Internet Explorer(此旧服务器上的 8.0 版)中尝试 URL,我会收到 "Internet Explorer cannot display the web page" 错误。我什至无法登录我想访问的网站。 Firefox 工作正常,但我不知道如何将 HttpWebRequest 强制到 "be" 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;
}
最后的 catch 不应该捕获任何一般异常吗?需要明确的是,我看到的错误是在 运行-TIME——我无法在这台机器上调试,因为它上面没有 Visual Studio(这不是一个选项)。所以,我不知道这个过程认为什么是空的。我怎样才能找到它?我知道这条线的原因:
WebResponse webResponse = request.GetResponse();
问题是因为我在每行之间放置了消息框,直到我发现哪一行被炸毁了。当应用程序崩溃时,运行 "Debug" 版本的 exe 会提供更多调试信息吗? (注意:EXE 的调试版本似乎没有提供任何更多信息,而且我不能添加 NullReferenceException
,因为编译器说之前的 "catch" 已经为它设置了陷阱……但它没有。 ).
请求不能为空。 WebRequest.Create()
应该符合你的 RequestURI
并且会 return 出现以下错误 Invalid URI: The format of the URI could not be determined
。然而,我看到了其他例子,人们绕过了这个问题,比如“https://helloworld.comFoo/Bar.html”。
远程名称 RequestUri
可能不正确,您应该在调用 webRequest.GetResponse()
之前对其进行测试。方法 WebRequest.Create()
不会检查这个 100%。
答案是...我是个白痴
异常被捕获,它进入 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; };
砰!一切正常。我不会把它留在那儿,因为它不安全,但它确实解决了问题。
所以,错误是可以捕获的(实际上是被捕获了!),我首先弄清楚了为什么会出现这个问题。感谢大家的帮助!