2009-01-27 44 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塊。否則,你應該記錄異常並繼續前進。不要只抓它扔它。

相關問題