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 - Позволяет последующее открытие файла для записи. Если этот флаг не указан, любой запрос на открытие файла для записи (этим процессом или другим процессом) не будет выполнен, пока файл не будет закрыт. Однако даже если этот флаг указан, для доступа к файлу могут потребоваться дополнительные разрешения.

Другие вопросы по тегам