HttpWebRequest fois sur le deuxième appel

pourquoi le code Timeout suivant est-il la deuxième fois (et la suivante) qu'il est exécuté?

le code pend à:

using (Stream objStream = request.GetResponse().GetResponseStream())

et provoque alors une WebException disant que la requête a été chronométrée.

j'ai essayé avec un WebRequest et HttpWebRequest

Edit: Il semble que le code est de tomber dans request.GetResponse()

Edit: ce post suggère qu'il pourrait s'agir d'un problème du GC --> http://www.vbforums.com/showthread.php?t=610043 - selon ce post, le problème est atténué si Fiddler est ouvert en arrière-plan.

le serveur est là et disponible pour les requêtes.

    private string GetQLMResponse(string URL)
    {
        HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest;
        request.Credentials = new NetworkCredential(Settings.Default.LicenseUser, Settings.Default.LicensePassword);
        request.KeepAlive = false;
        request.Timeout = 5000;
        request.Proxy = null;

        // Read stream
        string responseString = String.Empty;
        try
        {
            using (var response = request.GetResponse())
            {
                using (Stream objStream = response.GetResponseStream())
                {
                    using (StreamReader objReader = new StreamReader(objStream))
                    {
                        responseString = objReader.ReadToEnd();
                        objReader.Close();
                    }
                    objStream.Flush();
                    objStream.Close();
                }
                response.Close();
            }
        }
        catch (WebException ex)
        {
            throw new LicenseServerUnavailableException();
        }
        finally
        {
            request.Abort();
            request = null;
            GC.Collect();
        }
        return responseString;
    }

WebException lancée est:

{"l'opération est chronométrée"} [Système.Net.WebException]: {"L'opération a expiré"} Données: {Système.Collection.ListDictionaryInternal} HelpLink: null InnerException: null Message: "l'opération est terminée" Source: "Le Système" StackTrace: "at System.Net.HttpWebRequest.GetResponse ()rn À IQX.L'octroi de licences.Licence.GetQLMResponse (String URL) dans C:UsersjdSVNjdProductsDevelopmentJAD.LicenceJAD.LicenceLicence.cs: ligne 373" TargetSite: {System.Net.WebResponse GetResponse ()}


mise à jour: OK donc le code suivant fonctionne maintenant. Le point de service fixait le temps d'arrêt à près de 4 minutes. Changer ServicePoint.ConnectionLeaseTimeout sur l'objet request signifie que la requête est maintenant détruite après 5000ms. Merci à tous pour votre aide et aussi à ces 2 pages:

  1. http://blogs.msdn.com/b/adarshk/archive/2005/01/02/345411.aspx
  2. http://msdn.microsoft.com/en-us/library/6hszazfz (v = VS.80).aspx

    private string GetQLMResponse(string URL)
    {
        HttpWebRequest request = WebRequest.Create(URL) as HttpWebRequest;
        request.Credentials = new NetworkCredential(Settings.Default.LicenseUser, Settings.Default.LicensePassword);
        request.KeepAlive = false;
        request.Timeout = 5000;
        request.Proxy = null;
    
        request.ServicePoint.ConnectionLeaseTimeout = 5000;
        request.ServicePoint.MaxIdleTime = 5000;
    
        // Read stream
        string responseString = String.Empty;
        try
        {
            using (WebResponse response = request.GetResponse())
            {
                using (Stream objStream = response.GetResponseStream())
                {
                    using (StreamReader objReader = new StreamReader(objStream))
                    {
                        responseString = objReader.ReadToEnd();
                        objReader.Close();
                    }
                    objStream.Flush();
                    objStream.Close();
                }
                response.Close();
            }
        }
        catch (WebException ex)
        {
            throw new LicenseServerUnavailableException();
        }
        finally
        {
            request.Abort();
        }
        return responseString;
    }
    
41
demandé sur Darbio 2011-04-29 05:47:22

7 réponses

dans la foulée des réponses précédentes, je voulais ajouter quelques choses. Par défaut HttpWebRequest ne permet que 2 connexions sur le même hôte (ceci est HTTP 1.1 "niceness"),

Oui, il peut y avoir des dérogations, Non Je ne vous dirai pas comment dans cette question, vous devez en poser une autre :) Je pense que vous devriez regarder ce post .

je pense que vous n'êtes pas encore tout à fait disposer de toutes vos ressources liées à la HttpWebRequest, donc la mise en commun des connexions entre en jeu et c'est le problème. Je n'essaierais pas de combattre la règle des 2 connexions par serveur, à moins que vous ne le deviez vraiment.

comme L'une des affiches ci-dessus notée, Fiddler vous fait un peu de tort dans cette affaire.

j'ajouterais une jolie clause finally {} après votre capture et je m'assurerais que comme le note le post ci-dessus, tous les flux sont rincés, fermés et les références à l'objet request sont définies à null.

dites-nous si cela peut aider.

25
répondu dawebber 2017-05-23 12:03:08

le WebResponse obtenu par request.GetReponse() doit être éliminé correctement. Essayez ceci (suppression des appels request.Abort() et GC.Collect() ):

using (var wresponse = request.GetResponse())
{
   using (Stream objStream = wresponse.GetResponseStream())
   {
        // ...
   }
}

Modifier : Puisque cela ne fonctionne toujours pas, je vous suggère de tester cela avec une application Windows vide. De cette façon, vous pouvez isoler app.problèmes de configuration ou appels simultanés maximums par hôte* (utilisez-vous un autre objet webrequest ailleurs dans votre application à cet hôte; lequel webresponse ne sont pas éliminés correctement?).

Espérons que cela à résoudre votre problème, je suis à court d'idées!

  • voir la réponse de Jon Skeet ici .
21
répondu Sam B 2017-05-23 11:47:26

comme vous l'avez dit, exécuter fiddler en arrière-plan atténuerait le problème. C'est parce que fiddler force ferme toutes les réponses. S'étendant sur le poteau ci-dessus de Sam B Je m'assurerais que la réponse est fermée comme ceci:

using (var wresponse = request.GetResponse())
{
   using (Stream objStream = wresponse.GetResponseStream())
   {
        // ...
   } 
   wresponse.close();
}

aussi, il peut être utile de définir le proxy à nul comme ceci:

 request.Proxy = Null;

comme le .net framework va sortir à la recherche d'un proxy à moins que vous ne le fassiez explicitement. Quand fiddler dirige ceci l'effet serait atténué comme violonistes proxy doit être trouvé directement.

8
répondu Sean Hunter 2011-04-29 02:23:50

a rencontré le même problème avec les timeouts sur les requêtes ultérieures au serveur malgré l'élimination/vidange/fermeture de tout correctement. essayez de rincer votre groupe de connexion, a travaillé pour moi:

myRequest.ServicePoint.CloseConnectionGroup(myRequest.ConnectionGroupName);

aussi, assurez-vous de ne pas créer par inadvertance d'autres objets HttpWebRequest/Request ailleurs dans votre application qui ne sont pas correctement terminés/éliminés, car cela augmentera le nombre de connexions dans le point de Service.

4
répondu rdltrr 2017-01-25 03:03:49

j'ai eu le même problème, et je l'ai résolu en m'assurant que j'appelle la méthode Abort() sur chaque objet de requête créé.

1
répondu Paul Schneider 2015-01-12 12:37:29

par hasard utilisiez-vous une application de test avec le nom par défaut de WindowsFormsApp N ? J'ai eu le même problème que j'ai passé une semaine à déboguer parce que ça marchait dans mon code de production mais pas dans une solution de test simple que je construisais. En fin de compte, j'ai déterminé que ce comportement était unique à l'utilisation du nom de la solution par défaut au lieu d'une solution correctement nommée.

Edit: j'ai découvert que mon problème était lié à L'utilisation de BitDefender comme mon Logiciel AV. Les programmes WindowsFormsApp N ont tous été bloqués.

0
répondu oldSchool 2017-12-06 20:34:15

j'ai mis le temps http à 10 minutes et ça a marché pour moi.

Le réglage de

à timeout=infinite prenait plus de temps et mon programme était en mode hung.

-3
répondu Satish D 2015-06-09 11:12:11