Как я могу остановить IIS 7 блокировки файла .XSLT в C # - PullRequest
5 голосов
/ 06 февраля 2010

У меня есть следующие строки кода:

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

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

Работает нормально, если я остановил проект и запустил его снова, я получил следующую ошибку:

[System.IO.IOException] = {"Процесс не может получить доступ к файлу 'C: \ website \ TransList.xslt', так как он используется другим процессом."}

Затем мне нужно перейти в командную строку и выполнить IISRESET, чтобы получить, я также могу сбросить пул приложений, в данный момент это проще всего, так как это всего лишь мой ящик для разработчиков.

Теперь у меня есть вызов в операторе try catch, но я не могу получить доступ к объекту xslt в обработчике.

У объекта xslt нет метода закрытия или удаления.

Кажется, сборщик мусора никогда не выстрелил в него.

Есть идеи?

Ответы [ 3 ]

9 голосов
/ 06 февраля 2010

Вам необходимо закрыть FileStream и Reader, явно используя .Close () или с помощью оператора using:

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);
        }
     }
4 голосов
/ 06 февраля 2010

Нет необходимости явно создавать FileStream и XmlReader. Если вы знаете местоположение файла, вы можете просто передать его в метод Load, используя this overload :

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

Если вы считаете, что вам нужно создать FileStream и XmlReader, тогда я согласен с уже внесенными предложениями, используйте выражение «using» для правильного закрытия и удаления этих объектов.

2 голосов
/ 06 февраля 2010

Файловый поток реализует IDisposable и требует, чтобы вы вызывали Dispose для освобождения внешних ресурсов, а также неявных; y вызываете close (). Вы должны обернуть свои экземпляры Filestream в блок using, поскольку он гарантирует, что Dispose вызывается, даже если вызвано исключение. Однако, чтобы ответить на ваш вопрос, поскольку вы не закрыли файловый поток, ваш процесс, предположительно, у процесса w3wp.exe, все еще имеет дескриптор файлового потока, и единственный способ освободить его - сбросить iis или перезапустить пул приложений. Для дальнейшего использования просто оберните файловый поток в блок using для безопасности.

...