IIS 锁定由 XMLWriter 创建的文件

IIS locking a file created by XMLWriter

我写了一个 .Net Web API,它接受输入,解析它们,然后将 XML 文件存储在链接到我们服务器的网络共享上。我还构建了一个 Windows 服务,该服务扫描网络共享以查找新文件以处理我们的业务逻辑。

这在几乎 100% 的时间都有效,但偶尔(20,000 次中有 1 次)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 仍然持有锁?

您是否尝试将代码包装在 "Using" 块中?这确保了 FileStream 和 XmlWriter 的类型在块的作用域结束后得到处理。

我可以看到,您已经创建了 FileStream 个实例 FileShare = none,而您的要求是,您需要在共享位置上同时读取和写入。

正确的代码是

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

FileShare - A constant that determines how the file will be shared by processes.

有关更多信息 - 请参阅此 - 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 - Allows subsequent opening of the file for writing. If this flag is not specified, any request to open the file for writing (by this process or another process) will fail until the file is closed. However, even if this flag is specified, additional permissions might still be needed to access the file.

我认为你需要把这个过程分开。首先在文件夹 X 上创建文件。一旦创建,然后将此文件从文件夹 X 移动到共享位置,因为有与此网络共享关联的观察者。此外,一旦找到文件,然后选择它并移动到工作文件夹,然后在该文件上启动您的业务流程。 0 字节可能是写入和监视死锁的指示器。