2009-01-27 59 views
0

运行以下Java代码时,我确定测试的网页是否运行时会得到非常准确和一致的结果。测试时,Java和c#代码之间的不同性能

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模式有误报的高得多的结果(主要是由于超时 - 其中有100000ms的默认时期)。

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代码的有效性,无济于事。

任何想法?

回答

1

简单地改变这样的:

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

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

(从前面拆下声明。)

直到你没有关闭/置于响应(或者它已经敲定),它坚持连接。您一次只能有一个连接到任何一台主机的特定号码(我相信默认是2个),因此超时。处置响应时,它允许其他请求使用相同的连接。

3

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

+0

他们会不会只是超出范围? – 2009-01-27 21:08:09

+0

不,这还不够。确保你打电话*任何*关闭方法,你可以找到你使用的所有HTTP相关的对象;) – krosenvold 2009-01-27 21:10:40

+0

有一些池,这是你必须关闭的原因。 – krosenvold 2009-01-27 21:11:24

0

我认为你缺少的GregorianCalendar在C#版本:-)

你为什么在C#版本二的请求对象?

1

而且这样的:

catch (Exception e) 
    { 
     throw e; 
    } 

什么也不做,但摧毁一个已经向上冒泡异常堆栈跟踪。如果你在你的代码的其他地方有错误处理,我建议删除try catch块。否则,你应该记录异常并继续前进。不要只抓它扔它。