【问题标题】:IIS locking a file created by XMLWriterIIS 锁定由 XMLWriter 创建的文件
【发布时间】:2015-03-21 02:09:38
【问题描述】:

我编写了一个 .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 仍然持有锁?

【问题讨论】:

    标签: asp.net .net-3.5 iis-6 xmlserializer locked-files


    【解决方案1】:

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

    【讨论】:

    • 一个好建议,谢谢。如果 Using 块没有任何效果,我会试试这个。
    【解决方案2】:

    我可以看到,您创建了 FileStream 实例,FileShare = none,而您的要求表明,您需要同时在共享位置上读写。

    正确的代码是

    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 - 允许随后打开文件进行写入。 如果未指定此标志,则任何打开文件的请求 写入(通过此进程或另一个进程)将失败,直到文件 已经关闭。然而,即使指定了这个标志,额外的 访问该文件可能仍需要权限。

    【讨论】:

    • 我不想同时读写文件。该文件应保持锁定,直到它被写入,Windows 服务将等到它不再被锁定才能处理它。否则在处理文件时可能不会将重要信息写入文件。
    • 有了这个,读操作不会被锁定,写完后,你可以搜索FileShare的其他值,还有一个Read值。
    • 我的意思是我想保持文件锁定直到它被完全写入,否则 Windows 服务会将它移动到一个失败的文件夹中。我不确定你是否理解我的问题。
    【解决方案3】:

    您是否尝试将代码包装在“使用”块中?这确保了 FileStream 和 XmlWriter 类型在块的范围结束后被释放。

    【讨论】:

    • 感谢您的回答。我已将 Using 块添加到我的代码中,但这几天不会进入我们的生产环境,因此我无法确认它是否能立即解决问题。
    • 显然我已经在代码投入生产之前对其进行了测试。如果您阅读了我的帖子,您就会知道该问题仅在生产中发生并且很少发生,因此我无法在我们的 Stage 环境中复制该问题。因此,知道问题已解决的唯一方法是在我们的生产环境中对其进行监控。
    • 这似乎已经解决了问题,至少对于今天的流量来说是这样。我会继续监控,但已将此标记为答案。谢谢。
    • 遗憾的是,问题仍然偶尔会出现。我将把这归因于运行在 VMWare 上的 Windows Server 2003 和 IIS 6 即将报废。我们将在今年升级我们的操作系统,所以希望这能彻底解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多