2016-02-09 1 views
0

J'ai récemment écrit une fonction C# qui effectue une publication en plusieurs parties pour télécharger des fichiers. Pour suivre la progression, j'écrirais les données de formulaire dans le flux de requête à 4096 octets à la fois et rappeler à chaque écriture. Cependant, il semble que la requête ne soit même pas envoyée avant l'appel de GetResponseAsync().Suivi de la progression du téléchargement avec HttpWebRequest

Si tel est le cas, le rapport de tous les 4096 octets écrits dans le flux de requêtes est-il un rapport précis de la progression du téléchargement?

Sinon, comment puis-je rapporter les progrès avec précision? WebClient est hors de question pour moi, c'est dans un projet PCL Xamarin.

private async Task<string> PostFormAsync (string postUrl, string contentType, byte[] formData) 
    { 
     try { 
      HttpWebRequest request = WebRequest.Create (postUrl) as HttpWebRequest; 

      request.Method = "POST"; 
      request.ContentType = contentType; 

      request.Headers ["Cookie"] = Constants.Cookie; 

      byte[] buffer = new byte[4096]; 
      int count = 0; 
      int length = 0; 
      using (Stream requestStream = await request.GetRequestStreamAsync()) { 
       using (Stream inputStream = new MemoryStream (formData)) { 

        while ((count = await inputStream.ReadAsync (buffer, 0, buffer.Length)) > 0) { 
         await requestStream.WriteAsync (buffer, 0, count); 
         length += count; 
         Device.BeginInvokeOnMainThread (() => { 
          _progressBar.Progress = length/formData.Length; 
         }); 
        } 
       } 
      } 
      _progressBar.Progress = 0; 

      WebResponse resp = await request.GetResponseAsync(); 

      using (Stream stream = resp.GetResponseStream()) { 
       StreamReader respReader = new StreamReader (stream); 
       return respReader.ReadToEnd(); 
      } 

     } catch (Exception e) { 

      Debug.WriteLine (e.ToString()); 
      return String.Empty; 
     } 
    } 

S'il vous plaît noter que je demande au sujet de suivre les progrès d'un téléchargement à 4096 octets à la fois, pas télécharger

+0

double possible de [Affichage des progrès dans le pourcentage lors du téléchargement et le téléchargement en utilisant la classe HttpWebRequest] (http://stackoverflow.com/questions/20726797/ show-progress-in-percentage-while-uploading-and-téléchargement-using-httpwebrequ) – Jason

+0

La réponse à ce message concerne le ** téléchargement ** des progrès. Je demande à propos du ** téléchargement ** des progrès. –

Répondre

3

J'ai fini par y parvenir en définissant la propriété AllowWriteStreamBuffering du WebRequest égal à false et la propriété SendChunked à true. Cependant Xamarin.PCL (Profil 78) ne vous permet pas d'accéder à ces propriétés de HttpWebRequest, j'ai donc dû instancier mon HttpWebRequest et le renvoyer d'un service de dépendance dans mon projet spécifique à la plate-forme (uniquement testé dans iOS).

public class WebDependency : IWebDependency 
{ 
    public HttpWebRequest GetWebRequest(string uri) 
    { 
     var request = WebRequest.Create (uri) as HttpWebRequest; 
     request.SendChunked = true; 
     request.AllowWriteStreamBuffering = false; 

     return request; 

    } 

} 

Et puis instancier ma demande web -

HttpWebRequest request = DependencyService.Get<IWebDependency>().GetWebRequest(uri);