IIS блокирует файл, созданный XMLWriter
Я написал.Net Web API, который принимает входные данные, анализирует их и затем сохраняет XML-файл в сетевой папке, связанной с нашим сервером. Я также создал службу Windows, которая сканирует сетевой ресурс на наличие новых файлов для обработки нашей бизнес-логики.
Это работает почти 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 ответа
Вы пытались обернуть код внутри блоков "Using"? Это гарантирует, что типы FileStream и XmlWriter будут удалены после окончания области действия блока.
Я думаю, вам нужно отделить этот процесс. Сначала создайте файл, скажем, в папке X. После создания переместите этот файл из папки X в общую папку, так как с этой сетевой папкой связан наблюдатель. Кроме того, как только файл найден, выберите его и переместите в рабочую папку, а затем запустите бизнес-процесс для этого файла. 0 байт может быть индикатором записи и просмотра тупика.
Я вижу, что вы создали FileStream
экземпляр с FileShare
= нет, тогда как ваше требование гласит, что вам нужно одновременно читать и писать в общем местоположении.
Правильный код будет
FS = New FileStream(strFullFileName, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite)
FileShare - константа, определяющая, как файл будет использоваться процессами.
Для получения дополнительной информации - обратитесь к этому - https://msdn.microsoft.com/en-us/library/5h0z48dh(v=vs.110).aspx
РЕДАКТИРОВАТЬ
Из комментария я обнаружил, что вам нужно заблокировать, чтобы подать заявку на Read
операции, и ошибка, которую вы получаете (не так часто), может быть из-за блокировки записи. Чтобы избежать этого, вы можете использовать следующее.
FS = New FileStream(strFullFileName, FileMode.Create, FileAccess.ReadWrite, FileShare.Write)
FileShare.Write
- Позволяет последующее открытие файла для записи. Если этот флаг не указан, любой запрос на открытие файла для записи (этим процессом или другим процессом) не будет выполнен, пока файл не будет закрыт. Однако даже если этот флаг указан, для доступа к файлу могут потребоваться дополнительные разрешения.