HttpWebRequest.GetResponse()抛出不可捕获的错误
本文关键字:错误 GetResponse HttpWebRequest | 更新日期: 2023-09-27 18:10:46
我正在Windows 2003服务器上测试我用c# (Visual Studio 2015)编写的web服务应用程序。应用程序运行良好,但当我运行代码行:
WebResponse webResponse = request.GetResponse();
如果request是一个HttpWebRequest实例,应用程序抛出一个"对象引用未设置为对象的实例"。
在每个人都告诉我去研究那个错误之前,我已经。这里没有意义。HttpWebRequest当然不是空的,我可以在程序崩溃之前访问它的属性,如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;
}
最后一个catch不应该捕获任何一般异常吗?要明确的是,我看到的错误是在运行时——我无法在这台机器上调试,因为它没有Visual Studio(这不是一个选项)。所以,我不知道进程认为什么是空的。我怎样才能知道呢?我知道这句话的原因:
WebResponse webResponse = request.GetResponse();
是问题所在,因为我把消息框放在每行之间,直到我发现哪一行是爆炸的。当应用程序崩溃时,会把exe的"调试"版本提供更多的调试信息吗?(注意:EXE的调试版本似乎没有提供任何更多的信息,我不能添加NullReferenceException
,因为编译器说以前的"捕获"已经陷阱了……
答案是…我是个白痴。
异常被捕获,它去到webeexception分支,然后在那里出错,因为在那个处理程序中我尝试:
lcResult = "ERROR (web exception): " + Environment.NewLine + new StreamReader(wex.Response.GetResponseStream()).ReadToEnd();
这在x的时候就不太管用了。响应为空。在这种情况下,它是空的,因为请求一开始就没有建立连接。
一个更健壮的错误处理程序可以嵌套另一个try..catch来捕获任何额外的错误,或者只是确保你将在处理程序中使用的东西总是有效的。我将我的webeexception处理程序更改为:
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; };
,砰!一切工作。我不会把它留在那里,因为它不安全,但它确实解决了这个问题。
因此,错误是可捕获的(实际上是被捕获的!),并且我首先找出了问题出现的原因。感谢大家的帮助!
请求不应该为空。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%检查这个