2009-06-15 23 views
9

J'ai un WebService SOAP standard avec un WebMethod qui accepte un tableau d'octets et exécute alors unFile.WriteAllBytes provoque une erreur « ressources système insuffisantes pour terminer le service demandé »

[WebMethod(true)] 
WriteFile(byte[] Data, string FilePath) 
{ 

    File.WriteAllBytes(FilePath, Data); 
} 

Si ce processus est adopté une grand fichier, par exemple 2 meg il bombarde avec le message d'erreur suivant:

ressources système insuffisantes pour terminer le service demandé

regardant la trace de la pile je reçois:

  • System.IO.File.WriteAllBytes
  • System.IO.FileStream.Write
  • System.IO.FileStream.WriteCo re
  • System.IO .__ Error.WinIOError
  • System.IO.IOException: ressources système insuffisantes pour terminer le service therequested

J'ai essayé toutes les choses évidentes telles que le réglage de la maxRequestLength et le délai d'exécution à des paramètres plus réalistes:

<httpRuntime maxRequestLength="409600" executionTimeout="900"/> 

Il semble toujours échouer avec ce qui précède. Si vous envoyez un fichier plus petit, il enregistre sur le disque très bien .. Donc c'est la taille du fichier ou l'heure qui pose problème.

Est-ce que quelqu'un sait d'autre chose que je peux faire pour régler cela?

Merci

Dave

Répondre

0

Un maxRequestLength de 409600 limitera la taille des données à environ 400 Ko, donc un fichier 2Mb dépassera largement ce.

Les gens de GuidanceShare discutent bien ce genre de situation. En un mot:

  • Si nécessaire, augmentez la valeur maxRequestLength, comme vous l'avez expliqué.
  • Envisagez d'implémenter le streaming. Dans .NET 1.1, utilisez une classe qui implémente IList en tant qu'objet de transfert de données et définissez HttpContext.Current.Response.BufferOutput=false; dans le code côté client. .NET enverra automatiquement les éléments de la liste un par un, de sorte que chaque élément de la liste pourrait être un tampon de 1 Ko d'octets.
  • Si vous pouvez utiliser .NET 2 ou supérieur, considérez WCF. Cela implémente la diffusion automatique pour les liaisons HTTP.

Eh bien, c'est un hareng rouge alors! Merci pour les commentaires, semble que je me trompe.

+0

Hi. En regardant MSDN, il est dit que la valeur par défaut est 4096 (4 Mo) ... Il dit que c'est en kilo-octets ... msdn.microsoft.com/en-us/library/... Est-ce que c'est faux? – CraftyFella

+0

En outre, cela fonctionne très bien sur le développement et notre environnement de test, ce qui est très étrange! – CraftyFella

+0

MaxRequestLength est en kilo-octets. – OrionRobillard

1

Je ne vois pas que cela pourrait être dû à la valeur maxRequestLength. Le code est au milieu de FileStream.Write, si longtemps après toute question de réception de données. Confirmez cela en regardant Data.Length dans le débogueur.

Pourquoi avez-vous WebMethod (true)? Essayez simplement [WebMethod] et voyez ce qui se passe. WriteAllBytes charge le fichier entier dans la RAM avant de l'écrire sur le disque.

+0

Bonjour, Oui, j'ai confirmé que le serveur reçoit les données correctement. Je passe une somme de contrôle dans la version réelle, pour confirmer que les octets reçus sont les mêmes que les octets passés par le client. Je vais essayer la suggestion de webMethod et je reviendrai vers vous. Merci – CraftyFella

+0

BTW ... Juste en utilisant [webmethod] n'a rien changé. – CraftyFella

0

Vous manquez de mémoire.

3

Je sais que vous ne pas atteindre cette taille de fichier, mais aussi être conscient que File.WriteAllBytes a une limite de 64 Mo lors de l'écriture des chemins réseau - voir ce connect issue

+0

Merci .. Je vais essayer leur solution de contournement suggérée et revenir à vous .. chaîne path = "\\ serveur \ partage \ monfichier.pdf"; chaîne tempPath = Path.GetTempFileName() + "." + Path.GetExtension (chemin); File.WriteAllBytes (tempPath, fichier); File.Move (tempPath, chemin); Comme j'aimerais être en mesure d'obtenir la réponse à ce problème. :-) Dave – CraftyFella

3

je recevais un message d'erreur similaire lors de l'utilisation de fichiers .WriteAllBytes et modifié mon code pour utiliser un FileStream comme dans l'exemple ci-dessous. Basé sur les commentaires des autres, je suppose que FileStream a un impact mémoire plus petit.

 using (FileStream stream = new FileStream(FilePath, FileMode.Create, FileAccess.ReadWrite)) 
     { 
      stream.Write(Data, 0, Data.Length); 
      stream.Close(); 
     } 
+0

Cela a fonctionné très bien à l'exception que j'ai dû utiliser un 'MemoryStream' pour lire d'abord le tableau source' byte [] ', puis le sortir en morceaux. Suivi [cet exemple de découpage] (http://stackoverflow.com/a/12468420/175679), en utilisant une source 'MemoryStream'. Dans mon cas, IIS jette cette 'IOException' lors de l'écriture sur un partage réseau avec des fichiers de 20 Mo +. – SliverNinja

Questions connexes