2010-02-06 11 views
5

ben aşağıdaki kod satırlarını vardır:nasıl C# IIS 7 kilitleme .xslt dosyası durdurabilir

xslt.Load(XmlReader.Create(new FileStream(@"C:\website\TransList.xslt", System.IO.FileMode.Open))); 

xslt.Transform(mydoc.CreateReader(),null, sw); 

Ben projeyi durdurmak ve tekrar başlatmak eğer, gayet iyi çalışıyor, aşağıdaki hatayı alıyorum:

[System.IO.IOException] = { "işlem dosya 'C: \ sitesi \ TransList.xslt' erişemez. başka bir işlem tarafından kullanıldığı için"}

sonra gerek vardır komut satırına gidin ve almak için bir IISRESET yapın, ayrıca uygulama havuzunu da sıfırlayabilirim, bu sadece benim dev kutum olduğu için bu anda en kolay olanıdır.

Şimdi bir try catch ifadesinde çağrı var, ancak işleyicideki xslt nesnesine erişemiyorum.

xslt nesnesinin yakın veya atma yöntemi yok gibi görünüyor.

Çöp toplayıcısında hiç çekim olmaz, öyle görünüyor.

Herhangi bir fikrin var mı?

cevap

9

Ya açıkça .close (kullanarak, FileStream ve Reader kapatmak gerekir) veya kullanan özetinden:

using (FileStream fs = new FileStream(@"C:\website\TransList.xslt", System.IO.FileMode.Open)) 
    { 
    xslt.Load(XmlReader.Create(fs)); 
    using (var reader = mydoc.CreateReader()) 
     { 
     xslt.Transform(reader, null, sw); 
     } 
    } 
+0

Bu daha ayrıntılı bir çözümdür. Cevabını veren, önce + 6 puan aldı, önce cevapladı. –

2

Filestream ıdisposable uygular ve dış kaynakları serbest bırakmak için Dispose çağırmak yanı sıra gerektirir örtülü, y kapatabilir(). Bir istisna kaldırılmış olsa bile, Dispose'ın kullanılmasını sağladığından, Filestream'in örneklemesini bir kullanım bloğuna sarmalısınız. Yine de, sorunuzu yanıtlamak için, filestream'i kapatmamış olduğunuzdan, işleminiz, muhtemelen w3wp.exe işleminin dosya akışında bir tanıtıcıya sahiptir ve serbest bırakmanın tek yolu, iis'i sıfırlamak veya uygulama havuzunu geri dönüştürmektir. Gelecekte referans için, güvenli olması için filestream'i bir kullanım bloğuna sarın.

4
açıkça bir FileStream ve bir XmlReader oluşturmak gerekmez sonra dosya konumunu biliyorsanız sadece this overload kullanarak, yük yönteme olduğunu geçebilir vardır

:

XslCompiledTransform xslt = new XslCompiledTransform(); 
xslt.Load(@"C:\website\Translist.xslt"); 

Eğer gerek düşünüyorsanız bir FileStream ve bir XmlReader oluşturduktan sonra, daha önce yapılmış olan önerilere katılıyorum, bu nesneleri doğru şekilde kapatmak ve atmak için 'using' ifadesini kullanın.

+0

Teşekkürler, sorun buydu. Filestream'i çıkardım ve tek yapmam gereken buydu. ÇALIŞIYOR bir cazibe gibi. –