【问题标题】:Error Handling for WebRequest & ResponseWebRequest & Response 的错误处理
【发布时间】:2018-08-26 22:26:48
【问题描述】:

我目前正在运行一个方法,该方法接受一个字符串(域名)并检查该站点是否可用,并将信息传递到我创建的域对象中。目前,我遇到了一个问题,其中一个站点已关闭,进而导致应用程序崩溃。方法如下:

private Domain GetStatus(string x)
    {
        string status = "";

        WebRequest req = HttpWebRequest.Create("http://www." + x);
        WebResponse res = req.GetResponse();
        HttpWebResponse response = (HttpWebResponse)res;
        if ((int)response.StatusCode > 226 || response.StatusCode == HttpStatusCode.NotFound)
        {
            status = "ERROR: " + response.StatusCode.ToString();
        }
        else
        {
            status = "LIVE";
        }

        Domain temp = new Domain(x, status);
        return temp;
    }

最初的想法是 response.StatusCode == HttpStatusCode.NotFound 会处理这样的错误,但它目前正在崩溃 WebResponse res = req.GetResponse();回复如下:

System.Net.WebException: 'The remote name could not be resolved: 'www.DOMAIN.com''

【问题讨论】:

    标签: c# http httpwebresponse


    【解决方案1】:

    问题是由于您自己的代码引发了异常。

    这可能是由于缺少 Internet 连接或 dns 解析问题(可能是由远程方引起的)。

    所以,如果远程服务器抛出错误,你会得到HTTP 500 Internal Server Error,如果你无法访问它;您的代码抛出异常,您需要处理它。

    要解决此问题,您可以使用 try/catch 块,如下所示:

    private Domain GetStatus(string x)
    {
        string status = "";
    
        try
        {    
             WebRequest req = HttpWebRequest.Create("http://www." + x);
             WebResponse res = req.GetResponse();
             HttpWebResponse response = (HttpWebResponse)res;
             if ((int)response.StatusCode > 226 || 
                 response.StatusCode ==  HttpStatusCode.NotFound)
             {
                 status = "ERROR: " + response.StatusCode.ToString();
             }
             else
             {
                 status = "LIVE";
             }
         }
         catch (Exception e)
         {
              status = "ERROR: Something bad happend: " + e.ToString();
         }
    
         Domain temp = new Domain(x, status);
         return temp;
    }
    


    顺便说一句,消息,

    无法解析远程名称

    表示无法解析主机。

    最可能的原因是您的 Internet 已关闭,或者域拼写错误或到该域的路由错误(例如在 Intranet 环境中)。

    【讨论】:

    • 太棒了!这完全有道理,应用程序现在可以工作了。感谢您的洞察力!
    【解决方案2】:

    HttpWebRequest 是关于 HTTP 协议的,它是一种约定的语言

    但是如果对面的人不存在,那你怎么指望他回你一个“你好”呢?

    所以StatusCode 真的只是实际远程站点是否响应,响应状态根据请求资源是什么,是 Success(200) 吗?未找到(404)?未经授权(401)等等。

    异常意味着,由于多种原因,我无法访问该站点。 StatusCode 表示您请求的资源已返回此响应类型。

    但是更实际的检查站点是否存在,查询静态页面并且没有出现异常,更健康的检查,将查询静态页面,您将始终算作正常;意思是会返回一个 200 OK 响应。

    所以这一切都取决于LIVE对您(或使用它的客户)意味着什么。

    远程主机是否真的在接收请求,意味着没有异常。 或者这实际上意味着,他能够收到请求并向我返回我希望他返回的有效 StatusCode 响应(健康)。

    【讨论】:

    • 关于“live”的平视主观视角得分
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 2013-09-11
    • 2010-12-09
    相关资源
    最近更新 更多