2009-06-15 11 views
9

Tengo un servicio web estándar SOAP con un WebMethod que acepta una matriz de bytes y luego realiza unaFile.WriteAllBytes causas "Existen recursos de sistema insuficientes para completar el servicio solicitado" error

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

    File.WriteAllBytes(FilePath, Data); 
} 

Si este proceso se aprobó una archivo grande, por ejemplo 2 meg que está bombardeando a cabo con el mensaje de error siguiente: existen

recursos de sistema insuficientes para completar el servicio solicitado

Mirando el seguimiento de la pila estoy consiguiendo:

  • System.IO.File.WriteAllBytes
  • System.IO.FileStream.Write
  • System.IO.FileStream.WriteCo re
  • System.IO .__ Error.WinIOError
  • System.IO.IOException: existen recursos de sistema insuficientes para completar el servicio therequested

He intentado todas las cosas obvias como la creación de la maxRequestLength y ejecución de tiempo de espera para obtener configuraciones más realistas:

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

Parece que todavía falla con lo anterior. Si envía un archivo más pequeño, lo guarda bien en el disco. Por lo tanto, el problema es el tamaño del archivo o el tiempo.

¿Alguien sabe de algo más que pueda hacer para solucionar esto?

Gracias

de Dave

Respuesta

0

Un maxRequestLength de 409.600 limitará el tamaño de los datos a cerca de 400Kb, por lo que un archivo 2Mb superará en gran medida esto.

La gente de GuidanceShare habla bien de este tipo de situaciones. En pocas palabras:

  • Si es necesario, aumente maxRequestLength, como ya ha comentado.
  • Considere implementar la transmisión. En .NET 1.1, utilice una clase que implemente IList como el objeto de transferencia de datos y establezca HttpContext.Current.Response.BufferOutput=false; en el código del lado del cliente. .NET enviará automáticamente los elementos de la lista uno por uno, por lo que cada elemento de la lista podría ser un búfer de bytes 1K.
  • Si puede usar .NET 2 o superior, considere WCF. Esto implementa la transmisión automática de enlaces HTTP.

Bueno, eso es una pista falsa, entonces! Gracias por los comentarios, parece que estoy equivocado.

+0

Hola. Al mirar MSDN dice que el valor predeterminado es 4096 (4MB) ... Dice que está en kilobytes ... msdn.microsoft.com/en-us/library/... ¿Está mal? – CraftyFella

+0

¡También funciona bien en el desarrollo y nuestro entorno de prueba, que es muy extraño! – CraftyFella

+0

MaxRequestLength está en kilobytes. – OrionRobillard

1

No veo que esto pueda deberse a maxRequestLength. El código está en el medio de FileStream. Escríbela, mucho más allá de cualquier pregunta sobre la recepción de datos. Confirme esto mirando Data.Length en el depurador.

¿Por qué tiene WebMethod (verdadero)? Pruebe solo [WebMethod] y vea qué sucede.

+0

Hola, Sí, he confirmado que el servidor está recibiendo los datos correctamente. Paso una suma de cheque en la versión real en vivo, para confirmar que los bytes recibidos son los mismos que los bytes pasados ​​por el cliente. Probaré la sugerencia de webMethod y te responderé. Gracias – CraftyFella

+0

BTW ... Simplemente usar [webmethod] no cambió nada. – CraftyFella

0

WriteAllBytes carga todo el archivo en la memoria RAM antes de escribirlo en el disco. Te estás quedando sin memoria.

3

Sé que no están llegando a este tamaño de archivo, sino también tener en cuenta que File.WriteAllBytes tiene un límite de 64 MB cuando se escribe en las rutas de red - ver este connect issue

+0

Gracias ... Probaré su solución alternativa sugerida y le responderé ... string path = "\\ server \ share \ myfile.pdf"; cadena tempPath = Path.GetTempFileName() + "." + Path.GetExtension (ruta); File.WriteAllBytes (tempPath, archivo); File.Move (tempPath, ruta); Como me encantaría poder obtener la respuesta a este problema. :-) Dave – CraftyFella

3

que estaba recibiendo un mensaje de error similar al utilizar Archivo .WriteAllBytes y cambié mi código para usar FileStream como en el ejemplo a continuación. Según los comentarios de otros, creo que FileStream tiene un impacto de memoria menor.

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

Esto funcionó muy bien con la excepción de que tuve que usar un 'MemoryStream' para leer primero la fuente' byte [] 'matriz y luego canalizarlo en trozos. Seguido [este ejemplo de fragmentación] (http://stackoverflow.com/a/12468420/175679), utilizando una fuente 'MemoryStream'. En mi caso, IIS arroja esta 'IOException' cuando escribe en una red compartida con archivos de 20MB +. – SliverNinja

Cuestiones relacionadas