2011-05-03 13 views
5

Tengo una pequeña aplicación de carga donde cargo un archivo usando un servicio web (asmx), verifico el MD5 y lo verifico. El problema es que cuando verifico el archivo, dice que el archivo está bloqueado por otro proceso. A continuación se muestra el código para cargar y verificar:Problema con el bloqueo de IIS de mi archivo cargado

private static object padlock = new object(); 

Fragmentar el archivo de carga en bocados más pequeños y la carga de cada uno de ellos

[WebMethod] 
     public void LargeUpload(byte[] content, string uniqueName) 
     { 
      lock (padlock) 
      { 
       string path = Server.MapPath(PartialDir + "/" + uniqueName); 
       BinaryWriter writer = new BinaryWriter(File.Open(path, FileMode.Append, FileAccess.Write)); 
       writer.Write(content); 
       writer.Flush(); 
       writer.Close(); 
       writer = null; 
      } 
     } 

Después de la última insertarlo en mi base de datos. Después de esto, el cliente verifica el archivo mediante la solicitud del MD5:

[WebMethod] 
     public int EndLargeUpload(string name, int folderId, long length, string uniqueName, int customerid) 
     { 
      lock (padlock) 
      { 
       string path = Server.MapPath(PartialDir + "/" + uniqueName); 
       string newPath = Server.MapPath(RepositoryDir + "/" + uniqueName); 
       File.Copy(path, newPath); 
       //delete partial 
       File.Delete(path); 
       string extension = Path.GetExtension(uniqueName); 
       string newFileName = uniqueName; 
       GWFile newFile = new GWFile(); 
       newFile.DiscName = newFileName; 
       newFile.FileName = name; 
       newFile.FolderId = folderId; 
       newFile.Description = ""; 
       newFile.Size = (int)length; 
       newFile.DiscFolder = Server.MapPath("/Repository"); 
       newFile.DiscRelativePath = "/Repository/" + newFile.DiscName; 
       newFile.CustomerId = customerid; 
       IGWFileRepository fileRepository = ObjectFactory.GetInstance<IGWFileRepository>(); 


       fileRepository.SaveFile(newFile); 
       return newFile.Id; 
      } 
     } 

Después de que el método EndLargeUpload() el cliente llama al método RequestMD5 con el identificador del archivo, esta llamada exceptúa con una excepción que no puede abrir el archivo "..... xxx ..." porque está siendo utilizado por otro proceso ...

private string GetMD5HashFromFile(string fileName) 
      { 
       lock (padlock) 
       { 
        using (FileStream file = new FileStream(fileName, FileMode.Open)) // <-- excepts here 
        { 
         MD5 md5 = new MD5CryptoServiceProvider(); 
         byte[] retVal = md5.ComputeHash(file); 
         file.Close(); 

         StringBuilder sb = new StringBuilder(); 
         for (int i = 0; i < retVal.Length; i++) 
         { 
          sb.Append(retVal[i].ToString("x2")); 
         } 
         return sb.ToString(); 
        } 
       } 
      } 

que utiliza el explorador de proceso de Sysinternals para ver el archivo, se dice que el archivo está bloqueado por el servidor web (los pls refieren a esto img: http://screencast.com/t/oqvqWXLjku) - ¿cómo puede el servidor web bloquearlo? puedo solucionar esto?

+9

Consejo: No es necesario cerrar un BinaryWriter por triplicado (ras, cerca, configurado en nulo), llamando 'Close()' es suficiente O mejor aún, podrías usar un bloque 'using'. –

+1

¿Tiene alguna otra E/S de archivo en esta aplicación que toque estos archivos? – Ryan

+0

Para este tipo de proyecto, recomiendo usar 'IIS' en lugar de' Cassini' – Xaqron

Respuesta

0

cambió a IIS, y el problema parece que se vaya ...

0

¿Qué hay de las dos últimas líneas en el método EndLargeUpload:

IGWFileRepository fileRepository = ObjectFactory.GetInstance<IGWFileRepository>(); 
fileRepository.SaveFile(newFile); 

¿Es posible que IGWFileRepository.SaveFile() no se cierra correctamente el archivo?

Cuestiones relacionadas