none
System.ObjectDisposedException RRS feed

  • Pergunta

  • Hola,

    Estoy desarrollando un web service que devuelve una lista de archivos para actualizar, pero al recuperar el archivo para copiarlo en una ruta me sale el error: System.ObjectDisposedException{"No se puede obtener acceso a una secuencia cerrada."}

    El código es el siguiente:

                   
    var a = service.UpdateFiles(); //Aquí recupero los archivos en un objeto y el resultado obtenido del web service (WCF).
    
                if (a.OperationResult == OperationResult.Error ||
                    a.OperationResult == OperationResult.NotAvaible)
                {
                    label1.Text = a.Message;
                    service.Close();
                    return;
                }
    
                foreach (var item in a.Files) //En esta Lista están el nombre del archivo y el FileStream de cada archivo
                {
                    Stream up = item.FileStreamUpdate;
                    if(up != null)
                    {                    
                        using (FileStream file = new FileStream(tempPath + item.FileNameUpdate, FileMode.Create, FileAccess.ReadWrite))
                        {
                            up.CopyTo(file);  //Aqui muestra la excepción arriba mencionada               
                        }
                    }
    
                }

    Gracias por todo.


    sexta-feira, 14 de fevereiro de 2020 14:01

Respostas

  • Después de realizar varias pruebas la solución ha sido que el web service devuelva una lista de byte[] de cada archivo, asociarlo a un memorystream y utilizar el método writeto().

    Dejo el código por si alguien le puede servir.

    Gracias

    Codigo cliente:

    foreach (var item in a.Files)
                    {
                        MemoryStream up = new MemoryStream(item.FileStreamUpdate);

                        if (up != null)
                        {
                            FileStream file = new FileStream(tempPath + item.FileNameUpdate, FileMode.Create, FileAccess.ReadWrite);

                            up.WriteTo(file);
                            up.Close();
                            file.Close();
                            file.Dispose();

                        }

                    }

    Codigo servidor:

    using (FileStream file = new FileStream(path + item.Name, FileMode.Open, FileAccess.Read))
                        {
                            SrFile trFile = new SrFile();
                            var fInfo = item;
                            long numBytes = fInfo.Length;
                            BinaryReader br = new BinaryReader(file);
                             
                            byte[] data = br.ReadBytes((int)numBytes);
                            br.Close();
                            srFile.FileNameUpdate = item.Name;
                            srFile.FileStreamUpdate = data;

                            srFiles.Add(srFile);
                        }

    quarta-feira, 19 de fevereiro de 2020 14:14

Todas as Respostas

  • hola

    Estas en un desarrollo web, no se a que carpeta estas queriendo acceder pero por seguridaden este tipo de desarrollos solo puedes acceder a las carpetas del sitio web, todo lo que este por fuera esta prohibido

    No se que valor tomara tempPath, pero creo que estas usando un servicio web en WCF para algo que no se puede realizar

    Aplicar un Copy no lo veo que sea correcto en este cambiente, salvo que sean archivos dentro del propio sitio web donde hosteas el web service

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sexta-feira, 14 de fevereiro de 2020 15:31
  • Hola Leandro,

    El web service accede a la carpeta C:\UPdates del servidor para coger todos los archivos a actualizar y los añade a la lista Files que está compuesta por obejtos del tipo UpdateFiles de dos atributos, FileNameUPdate string y FileStreamUpdate FileStream.

    La ruta tempPath es donde se depositan los ficheros temporalmente en el equipo cliente C:\tempUpdate. Luego tendré que depositarlos en el directorio que le corresponda.

    Creo que el error es que el stream que recupero desde el servidor su File.Access no está en estado Open.

    Como bien dices no se si es la manera correcta de descargar ficheros desde un web service, es la primera vez que tengo que realizar este proceso. Si existe una manera mejor, podrías por favor facilitarme un ejemplo o un sitio donde informarme?.

    Gracias por tu tiempo.

    segunda-feira, 17 de fevereiro de 2020 10:10
  • Después de realizar varias pruebas la solución ha sido que el web service devuelva una lista de byte[] de cada archivo, asociarlo a un memorystream y utilizar el método writeto().

    Dejo el código por si alguien le puede servir.

    Gracias

    Codigo cliente:

    foreach (var item in a.Files)
                    {
                        MemoryStream up = new MemoryStream(item.FileStreamUpdate);

                        if (up != null)
                        {
                            FileStream file = new FileStream(tempPath + item.FileNameUpdate, FileMode.Create, FileAccess.ReadWrite);

                            up.WriteTo(file);
                            up.Close();
                            file.Close();
                            file.Dispose();

                        }

                    }

    Codigo servidor:

    using (FileStream file = new FileStream(path + item.Name, FileMode.Open, FileAccess.Read))
                        {
                            SrFile trFile = new SrFile();
                            var fInfo = item;
                            long numBytes = fInfo.Length;
                            BinaryReader br = new BinaryReader(file);
                             
                            byte[] data = br.ReadBytes((int)numBytes);
                            br.Close();
                            srFile.FileNameUpdate = item.Name;
                            srFile.FileStreamUpdate = data;

                            srFiles.Add(srFile);
                        }

    quarta-feira, 19 de fevereiro de 2020 14:14