2009-01-27 4 views
0

Lorsque j'exécute le code Java suivant, j'obtiens des résultats très précis et cohérents pour déterminer si la page Web que je suis en train de tester est active.Performances différentes entre Java et le code C# lors du test de l'URL

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; 
} 

Le match le plus proche du modèle Java en C# a des résultats beaucoup plus élevés de faux positifs (la plupart du temps en raison de délais d'attente - qui a une période par défaut de 100000ms). J'ai essayé différents modèles dans C# pour correspondre à l'efficacité du code Java cité, en vain.

Des idées?

Répondre

1

changer simplement ceci:

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

à

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

(Retirez la déclaration du début.)

Jusqu'à ce que vous n'avez pas fermé/disposé à la réponse (ou il a été finalisé), il maintient la connexion. Vous ne pouvez avoir qu'un certain nombre (2 par défaut, je crois) de connexions à un hôte à la fois, d'où les délais d'attente. Lorsque vous disposez de la réponse, cela permet à une autre requête d'utiliser la même connexion.

+0

le processResponseCode recherche le code de réponse (401 , 404, 200, ...) lors de la vérification de l'URL. –

+0

Oh, c'est vrai. Modification ... –

+0

Donc, devrais-je ajouter "res.Close();" à l'intérieur du bloc utilisant (...)? –

3

Je crois que c'est parce que vous ne fermez aucun des objets de requête.

+0

Ne seraient-ils pas simplement hors de portée? –

+0

Non, ce n'est pas suffisant. Assurez-vous que vous appelez * any * méthode de fermeture que vous pouvez trouver sur tous les objets liés à http que vous utilisez;) – krosenvold

+0

Il y a une mise en commun en cours, qui est la raison pour laquelle vous devez fermer. – krosenvold

0

Je pense que vous manquez la GregorianCalendar dans la version C# :-)

Pourquoi avez-vous deux objets de requête dans la version C#?

+0

LOL. C'est le meilleur diagnostic que j'ai vu aujourd'hui. – krosenvold

+0

Je travaille dessus, j'attends que ma soumission soit incorporée dans le framework 5.;) –

+0

J'ai 2 objets car on aurait du être commenté. C'est la 4ème itération et a eu quelques artefacts bâclés. –

1

également ceci:

catch (Exception e) 
    { 
     throw e; 
    } 

ne fait que détruire la trace de la pile sur une exception qui a été barboter vers le haut. Si vous avez des erreurs de gestion ailleurs dans votre code, je suggère de supprimer le bloc try catch. Sinon, vous devriez enregistrer l'exception et passer à autre chose. Ne l'attrape pas juste pour le jeter.

+0

Ou, lors d'une nouvelle utilisation, utilisez la syntaxe appropriée: http://stackoverflow.com/questions/380819/common-programming-mistakes-for-net-developers-to-avoid#380833 – lacop

Questions connexes