2011-08-23 2 views
1

Pour un peu plus de fond, s'il vous plaît voir: Problem with C# HTTP PUT request codeWebRequest - question .timeout

J'utilise la méthode C# WebRequest pour télécharger un fichier à S3. J'ai déjà une URL pré-signée que S3 me donne pour le téléchargement. Au départ, j'avais un problème: si je téléchargeais un gros fichier, le transfert s'arrêtait quelques minutes après le démarrage. Un commentaire sur mon autre poste a dit que c'était le .timeout qui le provoquait. Effectivement c'était.

Ma question est la suivante: Que dois-je définir .timeout ou comment puis-je calculer ce qu'il faut faire en fonction de la taille du fichier que je vais transférer?

Je ne veux pas démarrer une WebRequest avec un délai d'attente de 60 minutes lorsque je vais envoyer un petit fichier à S3, mais je pourrais aussi télécharger un fichier de gigaoctet sur S3 et si le délai d'attente est dépassé avant que le fichier ne soit terminé, le transfert sera interrompu.

De même comment pourrais-je piéger pour un délai de connexion? Est-ce que .timeout serait utilisé pour ça aussi? Que se passe-t-il si je veux seulement essayer une connexion pendant 30 secondes pour voir si S3 répond à ma requête Web PUT et si elle n'a pas le délai d'expiration.

Mon code est:

WebRequest request = WebRequest.Create(PUT_URL_FINAL[0]); 
//PUT_URL_FINAL IS THE PRE-SIGNED AMAZON S3 URL THAT I AM SENDING THE FILE TO 

request.Timeout = 360000; //6 minutes -- If the transfer is over 6 minutes, it stops. 

request.Method = "PUT"; 

//result3 is the filename that I am sending          
request.ContentType = 
    MimeType(GlobalClass.AppDir + Path.DirectorySeparatorChar + "unzip" + 
      Path.DirectorySeparatorChar + 
      System.Web.HttpUtility.UrlEncode(result3)); 

byte[] byteArray = 
    File.ReadAllBytes(
     GlobalClass.AppDir + Path.DirectorySeparatorChar + "unzip" + 
     Path.DirectorySeparatorChar + 
     System.Web.HttpUtility.UrlEncode(result3)); 

request.ContentLength = byteArray.Length; 
Stream dataStream = request.GetRequestStream(); 

dataStream.Write(byteArray, 0, byteArray.Length); 

dataStream.Close(); 

//This will return "OK" if successful. 
WebResponse response = request.GetResponse(); 
Console.WriteLine("++ HttpWebResponse: " + 
        ((HttpWebResponse)response).StatusDescription); 
+0

BTW, vos objets 'Stream' et' WebResponse' ont besoin être dans les blocs «using». –

Répondre

1

vous pouvez essayer de calculer le délai d'attente en fonction de la taille de votre fichier - mais pour cela signifie que vous devez connaître ou estimer une vitesse de transfert ...

Une autre option serait de choisir votre délai d'attente dans un "acceptable" pour les cas habituels et puis lors de l'exception réessayer avec double ou dix fois le "délai d'attente standard" ...