HttpWebRequest.GetResponse()抛出无法解决的错误

时间:2015-09-01 14:28:35

标签: c# web null request

我正在测试我在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”已经陷阱了......但它没有。)。

2 个答案:

答案 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%。