2016-07-27 1 views
0

J'ai écrit un HttpHandler afin de recevoir (télécharger) des fichiers. Il fonctionne sur IIS 8. Mon code fonctionne, mais seulement pour les très petits fichiers (< 1-2 Mo). Pour les fichiers plus volumineux, le code tombe en panne - sans même lancer une exception - il s'arrête et renvoie un message d'erreur "500 internal server error" au client.Crash dans HttpHandler en raison de la taille du flux

Mon code ressemble à ceci:

 int bufferSize = 4096; 
     string parameterString; 

     using (var bs = context.Request.GetBufferlessInputStream(true)) 
     using (var ms = new MemoryStream()) 
     { 
      byte[] fileContents = new byte[bufferSize]; 
      int charsRead = bs.Read(fileContents, 0, bufferSize); 

      while (charsRead > 0) 
      { 
       ms.Write(fileContents, 0, bufferSize); 
       charsRead = bs.Read(fileContents, 0, bufferSize); 
      } 

      parameterString = Encoding.UTF8.GetString(ms.ToArray()); 
     } 

Quand je reçois mon débogueur attacha arrête juste à la dernière ligne.

Ma config ressemble à ceci:

<basicHttpBinding> 
    <binding name="XXXX" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="21474836470" maxBufferSize="2147483647" maxReceivedMessageSize="21474836470"> 
     <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647" /> 
    </binding> 
    </basicHttpBinding> 

Je suis perdu à ce moment que je ne comprends pas pourquoi ma dernière ligne devrait être un problème? Est-ce autre chose?

Répondre

0

Quoi que vous fassiez ... par la suite il y aura un fichier qui est trop grand pour être téléchargé comme une fois ...

donc vous devez repenser votre approche, la meilleure solution est de télécharger le fichier en morceaux/les pièces. jetez un oeil sur cette sample

ce besoin d'être manipulé côté client/serveur

0

Merci pour l'indice de morceau le fichier. Je vais investir dans cela tôt ou tard - dans mon cas actuel plus tard.

J'ai fini avec ce code et au moins il a aidé à mon exigence actuelle:

parameterString = new StreamReader(context.Request.GetBufferlessInputStream(true)).ReadToEnd(); 

Je ne sais pas exactement pourquoi cela fonctionne alors que mon ancienne approche n'a pas mais bon ... ça marche si loin ...