2009-10-20 10 views
0

J'utilise VSTS 2008 + C# + .Net 3.5 pour développer une application console et j'envoie une requête à un autre serveur (IIS 7.0 sur Windows Server 2008). Voici mon code. Ma question est, comme dans mon code, j'utilise une boucle while pour lire des morceaux par morceau du serveur. La temporisation request.Timeout = Timeout * 1000 est responsable de (1) timeout pour la connexion ouverte au serveur, ou (2) timeout pour chaque opération de lecture, ou (3) le temps total utilisé pour la boucle while?Http request timeout issue

static void PerformanceWorker() 
    { 
     Stream dataStream = null; 
     HttpWebRequest request = null; 
     HttpWebResponse response = null; 
     StreamReader reader = null; 
     try 
     { 
      request = (HttpWebRequest)WebRequest.Create(TargetURL); 
      request.Timeout = Timeout * 1000; 
      request.Proxy = null; 
      response = (HttpWebResponse)request.GetResponse(); 
      dataStream = response.GetResponseStream(); 
      reader = new StreamReader(dataStream); 

      // 1 M at one time 
      char[] c = new char[1000 * 10]; 

      while (reader.Read(c, 0, c.Length) > 0) 
      { 
       globalCounter++; 
      } 
     } 
     catch (Exception ex) 
     { 
      lock (counterLock) 
      { 
       globalFailCounter++; 
       Console.WriteLine("Fail Counter: " + globalFailCounter + "\n" + ex.Message + "\n" + ex.StackTrace); 
      } 
     } 
     finally 
     { 
      if (null != reader) 
      { 
       reader.Close(); 
      } 
      if (null != dataStream) 
      { 
       dataStream.Close(); 
      } 
      if (null != response) 
      { 
       response.Close(); 
      } 
     } 
    } 
+0

Merci, je vais m'en occuper à partir de maintenant. :-) – George2

Répondre

3
  1. délai d'attente pour une connexion ouverte avec le serveur
+0

Ensuite, comment régler le délai d'attente pour chaque opération de lecture et pour la boucle while pour toute l'opération de lecture? – George2

+2

La propriété "ReadWriteTimeout" gère # 2. Vous devez suivre # 3 par vous-même. – David

+0

Vous voulez dire que ReadWriteTimeout fonctionne pour chaque opération de lecture/écriture dans ma boucle? – George2

1

A partir de MSDN:

délai d'attente est le nombre de millisecondes qu'une demande synchrone ultérieure faite avec le temps d'attente de la méthode GetResponse pour une réponse, et la méthode GetRequestStream attend un flux. Si la ressource n'est pas retournée pendant la période de temporisation, la demande émet une exception WebException avec la propriété Status définie sur WebExceptionStatus.Timeout.

Je ne sais pas si vous pouvez définir le délai d'attente pour l'opération de lecture facilement sans aucune astuce de bas niveau. Toutes les données que vous lisez à l'aide de l'objet de réponse proviennent du tampon de la carte réseau qui est rempli au débit de votre bande passante réseau disponible. Vous atteindrez le délai d'expiration à un moment donné lorsque vous effectuez une lecture lorsque le tampon est vide et qu'aucune nouvelle donnée ne provient du point de fin de l'expéditeur.

P.S. ceci est plus d'un commentaire à la réponse de @Gary, peut-être que quelqu'un pourrait le déplacer là.

+0

Vous voulez dire que HttpWebRequest.Timeout est uniquement utilisé pour une connexion ouverte? – George2

+0

J'ai une question connexe ici, appréciez si vous pouviez jeter un coup d'oeil. http://stackoverflow.com/questions/1598748/unable-to-connect-to-remote-server-fail-in-httpwebrequest – George2

+1

Well Timeout est utilisé pour ouvrir la connexion et pour toutes les demandes synchrones suivantes. L'appel de GetResponse() va donc expirer. Je suspecte qu'après que GetResponse() soit fait vous avez déjà toutes les données requises dans le tampon de réseau (carte). Lorsque vous exécutez l'opération Read(), vous ne récupérez pas réellement les bits du réseau, mais le tampon lui-même, donc le délai d'attente à ce stade n'est pas important. S'il vous plaît noter que je ne suis pas sûr à 100% que ce soit si simple, si la taille des données de réponse est plus grande que le tampon réseau, probablement à un moment donné, l'appel bloquera jusqu'à ce que le tampon est rempli de données. – Audrius