2011-05-03 22 views
5

Web servisini (asmx) kullanarak dosya yüklediğim, MD5'i kontrol edip doğruladığım küçük bir yükleme uygulamasına sahibim. Sorun şu ki, dosyayı doğruladığımda, dosyanın başka bir işlem tarafından kilitlendiğini söylüyor.IIS'de yüklenen dosyamı kilitleme sorunu

private static object padlock = new object(); 

küçük ısırıkları içinde yükleme dosyası Chunking ve benim veritabanına ekleyin sonuncusu sonra

[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; 
      } 
     } 

her biri yükleyerek: Aşağıda yüklenmesi ve doğrulanması için benim kodudur. EndLargeUpload() yönteminin istemci dosyasının id, bu dosyayı açamıyor bir istisna ile bu çağrı olağandışılıklar ile RequestMD5 yöntemini çağıran sonra

[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; 
      } 
     } 

: Bundan sonra istemci MD5 isteyerek dosyayı doğrular o

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(); 
        } 
       } 
      } 

Ben dosyayı görüntülemek için Process Explorer Sysinternals'den kullanılan ... başka bir işlem tarafından kullanılıyor s çünkü "..... xxx ...", bu dosya ile kilitli olduğunu söylüyor web sunucusu (lütfen bu img'ye bakın: http://screencast.com/t/oqvqWXLjku) - web sunucusu nasıl kilitleyebilir? bu konuda çalışabilir miyim?

+9

İpucu –

+1

Bu uygulamada bu dosyalara dokunacak başka bir dosya G/Ç var mı? – Ryan

+0

Bu tür bir proje için "Cassini" yerine "IIS" kullanılmasını öneririm – Xaqron

cevap

0

IIS hesabına geçildi ve sorun gitmesini görünüyor: Sen `Yakın çağırarak, üç nüsha (floş, yakın boş olarak ayarlanır) bir BinaryWriter kapatmak gerekmez()` oldukça yeterli. Veya daha da iyisi, `using` bloğunu kullanabilirsiniz.
0

Nasıl EndLargeUpload yönteminde son iki satır hakkında:

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

o IGWFileRepository.SaveFile() düzgün dosyası kapanmıyor olması mümkün mü? ...