2015-01-22 3 views
0

Я написал .Net Web API, который берет его входы, анализирует их и затем сохраняет XML-файл в сетевом ресурсе, связанном с нашим сервером. Я также создал службу Windows, которая сканирует сетевой ресурс для новых файлов для обработки нашей бизнес-логики.IIS, блокирующий файл, созданный с помощью XMLWriter

Это работает почти в 100% случаев, но очень редко (1 из 20 000 раз). IIS6 содержит блокировку файла, который он создает, и не будет очищаться до перезапуска IIS. Заблокированные файлы всегда равны 0 байтам.

В настоящее время у меня есть файл, который был заблокирован почти 20 часов! Вот код, который создает файл:

Try 
     '-- Make sure the file doesn't already exist 
     TempFileName = strFullFileName 
     i = 1 

     While IO.File.Exists(TempFileName) 
      TempFileName = strFullFileName.Replace(".xml", "_" & i & ".xml") 

      i += 1 
     End While 

     strFullFileName = TempFileName 

     '-- Deserialise the message into a file 
     drSerializer = New XmlSerializer(DetailsOfMsg.GetType) 
     FS = New FileStream(strFullFileName, FileMode.Create, FileAccess.ReadWrite, FileShare.None) 
     XW = XmlWriter.Create(FS) 
     drSerializer.Serialize(XW, DetailsOfMsg) 

    Finally 
     Try : XW.Flush() : Catch : End Try 
     Try : FS.Close() : Catch : End Try 
     Try : XW.Close() : Catch : End Try 
     FS = Nothing 
     XW = Nothing 
    End Try 

Почему IIS по-прежнему держит замок?

ответ

3

Вы пытались обернуть код в блоках «Использование»? Это гарантирует, что типы FileStream и XmlWriter будут удалены после завершения области действия блока.

+1

Спасибо за ответ. Я добавил блоки использования в свой код, но это не будет работать в нашей производственной среде в течение нескольких дней, поэтому я не смогу подтвердить, что он сразу решает проблему. – aaroncatlin

+0

Ну, очевидно, я проверил код перед его выходом в производство.Если бы вы прочитали мой пост, вы бы знали, что проблема возникает только в производстве и только очень редко, поэтому я не могу воспроизвести проблему в нашей среде Stage. Поэтому единственный способ узнать проблему - это контролировать ее в нашей производственной среде. – aaroncatlin

+0

Это, похоже, устранило проблему, ну, по крайней мере, для сегодняшнего трафика. Я продолжу следить, но отметил это как ответ. Благодарю. – aaroncatlin

0

Я вижу, что вы создали FileStream экземпляр с FileShare = none, тогда как в вашем требовании указано, что вам необходимо одновременно читать и писать в общем местоположении.

Правильный код будет

FS = New FileStream(strFullFileName, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite)

Обменник - константа, которая определяет, как файл будет совместно процессами.

Для получения дополнительной информации - см это - https://msdn.microsoft.com/en-us/library/5h0z48dh(v=vs.110).aspx

EDIT

Из комментариев, я обнаружил, что вам нужно заблокировать применяться для Read операции, и ошибка, вы получаете (не так часто) может быть из-за блокировки записи. Чтобы этого избежать, вы можете использовать следующее.

FS = New FileStream(strFullFileName, FileMode.Create, FileAccess.ReadWrite, FileShare.Write)

FileShare.Write - Позволяет последующее открытие файла для записи. Если этот флаг не указан, любой запрос на открытие файла для записи (этим процессом или другим процессом) завершится с ошибкой до тех пор, пока файл не будет закрыт. Однако, даже если этот флаг указан, для доступа к файлу может потребоваться дополнительные разрешения .

+0

Я не хочу одновременного чтения и записи в файл. Файл должен оставаться заблокированным до тех пор, пока он не будет записан, и служба Windows будет ждать, пока он больше не будет заблокирован, чтобы обработать его. В противном случае важная информация не может быть записана в файл при его обработке. – aaroncatlin

+0

При этом он не будет заблокирован для чтения ops, а запись будет выполнена, вы можете искать другие значения для 'FileShare', есть еще одно значение' Read'. –

+0

Я хочу, чтобы файл был заблокирован до тех пор, пока он полностью не написан, иначе служба Windows перенесет его в папку Failed. Я не уверен, что вы поняли мой вопрос. – aaroncatlin

1

Я думаю, вам нужно отделить этот процесс. Сначала создайте файл в папке с именем X. После его создания переместите этот файл из папки X в общую папку, так как есть наблюдатель, связанный с этим сетевым ресурсом. Кроме того, как только файл найден, выберите его и перейдите в рабочую папку, а затем запустите свой бизнес-процесс в этом файле. 0 байт может быть индикатором блокировки записи и просмотра.

+0

Хорошее предложение, спасибо. Я попробую это, если блокировки использования не имеют никакого эффекта. – aaroncatlin

Смежные вопросы