0

Contexte - Je suis en train de diffuser une page Web existante à une application Web distincte, en utilisant HttpWebRequest/HttpWebResponse en C#. Une question que je me frappe est que je suis en train de définir le fichier télécharger la demande de longueur de contenu en utilisant le fichier de téléchargement de contenu longueur, mais la question semble être lorsque la page Web source est sur un serveur Web pour lequel le HttpWebResponse ne fournir une longueur de contenu.obtenir un responseLength pour un téléchargement HttpWebRequest à partir d'un autre fichier Web pour diffuser dans le téléchargement lorsque la source n'implémente pas ContentLength?

HttpWebRequest downloadRequest = WebRequest.Create(new Uri("downloaduri")) as HttpWebRequest; 
using (HttpWebResponse downloadResponse = downloadRequest.GetResponse() as HttpWebResponse) 
{ 
    var uploadRequest = (HttpWebRequest) WebRequest.Create(new Uri("uripath")); 
    uploadRequest.Method = "POST"; 
    uploadRequest.ContentLength = downloadResponse.ContentLength; // #### 

QUESTION: Comment pourrais-je mettre à jour cette approche pour répondre à ce cas (lorsque la réponse de téléchargement ne dispose pas d'un ensemble de longueur de contenu). Serait-ce d'utiliser en quelque sorte un MemoryStream? N'importe quel code d'échantillon serait apprécié.

Répondre

1

Si vous êtes heureux de télécharger la réponse de l'autre serveur web complètement, ce serait en effet de rendre la vie plus facile. Il suffit d'écrire à plusieurs reprises dans un MemoryStream que vous allez chercher du premier serveur Web, alors vous savez la longueur à définir pour la deuxième demande et vous pouvez écrire les données facilement (en particulier comme MemoryStream a une méthode WriteTo pour écrire son contenu à un autre flux) .

L'inconvénient est que vous prendrez beaucoup de mémoire si elle est un gros fichier. Cela risque-t-il d'être un problème dans votre situation? Les alternatives incluent:

  • Ecriture dans un fichier au lieu d'utiliser un MemoryStream. Vous aurez besoin de nettoyer le fichier après, bien sûr - vous utilisez essentiellement le système de fichiers comme une plus grande mémoire :)
  • En utilisant un codage de transfert en bloc pour "lire un morceau, écrire un morceau"; ce peut être fiddly pour aller droit - ce n'est certainement pas quelque chose que j'ai fait avant.
+0

L'approche chunked semble intéressant. Quelqu'un sait si HttpWebRequest supporte cela? Est-ce le comportement par défaut pour un téléchargement si vous ne définissez pas la longueur du contenu? – Greg

+0

@Greg: Je ne suis pas sûr, pour être honnête - je vous suggère d'expérimenter :) –