0

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

4

3 回答 3

3

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

于 2015-01-27T11:00:07.200 回答
1

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

于 2015-02-02T08:12:12.553 回答
0

我可以看到,您已经创建FileStream了 = none 的实例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- 允许随后打开文件进行写入。如果未指定此标志,则任何打开文件进行写入的请求(由该进程或另一个进程)将失败,直到文件关闭。但是,即使指定了此标志,仍可能需要其他权限才能访问该文件。

于 2015-01-30T13:52:01.053 回答