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,因为编译器说以前的"捕获"已经陷阱了……

HttpWebRequest.GetResponse()抛出不可捕获的错误

答案是…我是个白痴。

异常被捕获,它去到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%检查这个