使用HttpWebRequest和WebResponse不在范围内的变量

时间:2015-10-06 18:47:39

标签: c# .net httpwebrequest httpwebresponse http-error

我的变量httpRes存在问题。基本上这是命令行应用程序的基础知识,它将检查一组给定的URL并返回其状态代码,即未经授权,重定向,确定等等。问题是我的列表中的一个应用程序不断抛出错误。所以我使用了一个try catch子句来捕获错误并告诉我是什么导致了它。

不幸的是,变量httpRes在try子句中起作用,但在catch中不起作用。它一直被返回为null。我在try / catch语句之外调用了httpRes,所以我希望我的范围是正确的,但无论出于什么原因,对于catch语句,值永远不会从null更改,只有try语句。

以下是引用的代码。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;

namespace URLMonitor
{
    class Program
    {
        static void Main(string[] args)
       {
            string url1 = "https://google.com"; //removed internal URL for security reasons.
            HttpWebRequest httpReq = (HttpWebRequest)WebRequest.Create(url1);
            httpReq.AllowAutoRedirect = false;
            HttpWebResponse httpRes = null;

            try
            {
                httpRes = (HttpWebResponse)httpReq.GetResponse();
                if (httpRes.StatusCode == HttpStatusCode.OK)
                {
                    Console.WriteLine("Website is OK");
                    // Close the response.
                    //httpRes.Close();
                }
            }
            catch
            {
                if (httpRes != null)
                {
                    if (httpRes.StatusCode == HttpStatusCode.Unauthorized)
                    {
                        Console.WriteLine("Things are not OK");
                        //httpRes.Close();
                    }
                }
                else
                {
                    Console.WriteLine("Please check the URL and try again..");
                    //httpRes.Close();
                }
            }
            Console.ReadLine();

        }
    }
}

1 个答案:

答案 0 :(得分:1)

如果你遇到异常,那可能是因为GetResponse失败了,对吧?所以你不会给httpRes分配任何东西......

在我看来,您应该抓住WebException,此时您可以查看回复 - 如果有的话:

catch (WebException e)
{
    // We're assuming that if there *is* a response, it's an HttpWebResponse
    httpRes = (HttpWebResponse) e.Response;
    if (httpRes != null)
    {
        ...
    }
}

非常从不值得编写一个裸catch块,顺便说一句 - 总是至少捕获Exception,但理想情况下还是会捕获更具体的异常类型,除非你'重新进入应用程序堆栈的顶层。

我个人不打算为两段代码使用相同的变量 - 我会在try块中声明成功案例的响应,并在catch块中声明失败案例的响应。另请注意,您通常应该处置WebResponse,例如

using (var response = request.GetResponse())
{
    // Use the response
}

如果GetResponse抛出异常并且您从异常中获得响应,我认为您不需要这样做。