Как я могу остановить IIS 7, блокирующий.XSLT файл в C#

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

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

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

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

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

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

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

Объект xslt, кажется, не имеет завершение или не располагает метод.

Сборщик "мусора" никогда не получает выстрел в него, это кажется.

Какие-либо идеи?

5
задан James Campbell 6 February 2010 в 14:18
поделиться

3 ответа

Вам нужно будет закрыть свой 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);
        }
     }
9
ответ дан 18 December 2019 в 11:56
поделиться

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

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

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

4
ответ дан 18 December 2019 в 11:56
поделиться

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

2
ответ дан 18 December 2019 в 11:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: