0

运行以下 Java 代码时,在确定我正在测试的网页是否启动时,我得到了非常准确和一致的结果。

protected synchronized boolean checkUrl(HttpURLConnection connection){
    boolean error = false;
    //HttpURLConnection connection = null;
    GregorianCalendar calendar = new GregorianCalendar();

    try{
        if(connection != null){
            connection.connect();

            //200 is the expected HTTP_OK response
            error = processResponseCode(connection.getResponseCode());

            connection.disconnect();
        } else{
            error = false;
        }

    }catch(java.net.UnknownHostException uhe){
        ...     } 
    catch(Exception e){
        ...     }

    return error;
}

与 c# 中的 Java 模式最接近的匹配具有更高的误报结果(主要是由于超时 - 默认周期为 100000 毫秒)。

protected bool connectedToUrl = false;
        response = null;

        HttpWebRequest webreq = (HttpWebRequest)WebRequest.Create(this.getUri());
        webreq.Credentials = CredentialCache.DefaultCredentials;
        WebResponse res = null;// webreq.GetResponse();

        try
        {
            WebRequest request = WebRequest.Create(this.getUri()) as WebRequest;
            request.Credentials = CredentialCache.DefaultCredentials;

            if (request != null)
            {
                // Get response 
                res = webreq.GetResponse();

                connectedToUrl = processResponseCode(res);
            }
            else
            {
                logger.Fatal(getFatalMessage());

                string error = string.Empty;
            }
        }
        catch (Exception e)
        {
            throw e;
        }

        return connectedToUrl;
    }

我在 c# 中尝试了各种模式来匹配引用的 Java 代码的有效性,但无济于事。

有任何想法吗?

4

4 回答 4

3

我相信这是因为您没有关闭任何请求对象。

于 2009-01-27T21:06:42.327 回答
1

还有这个:

   catch (Exception e)
   {
      throw e;
   }

除了在向上冒泡的异常上破坏堆栈跟踪之外什么都不做。如果您在代码的其他地方有错误处理,我建议删除 try catch 块。否则,您应该记录异常并继续。不要只是抓住它来扔它。

于 2009-01-27T21:12:39.647 回答
1

简单地改变这个:

res = webreq.GetResponse();
connectedToUrl = processResponseCode(res);

using (WebResponse res = webreq.GetResponse()) 
{
    connectedToUrl = processResponseCode(res);
}

(删除之前的声明。)

在您没有关闭/处置响应(或它已完成)之前,它会保持连接。您一次只能有一定数量(默认为 2,我相信)与任何一台主机的连接,因此会超时。当您处理响应时,它允许另一个请求使用相同的连接。

于 2009-01-27T21:18:40.133 回答
0

我认为您在 C# 版本中缺少 GregorianCalendar :-)

为什么在 C# 版本中有两个请求对象?

于 2009-01-27T21:06:56.333 回答