【问题标题】:w3wp.exe (NETWORK SERVICE user) is locking a newly created file and preventing access to itw3wp.exe(网络服务用户)正在锁定新创建的文件并阻止对其进行访问
【发布时间】:2011-12-14 19:24:39
【问题描述】:

我有一个 Web 应用程序。它将一系列图像发送到服务器(那里没问题),然后使用来自this tutorial 的代码创建一个 PowerPoint 演示文稿。演示文稿保存在 Web 服务器上的目录中,并将 URL 返回给用户。

但是,该文件仍在使用中,尝试访问它会在 IIS 7.5 中生成 500.0 错误。

如果我打开任务管理器并终止属于 NETWORK SERVICE 用户的 w3wp.exe 进程,一切都会按预期工作(可以下载和查看文件)。我还有另一个属于 DefaultAppPool 的 w3wp 进程,但它似乎不会引起问题。

我是这个 .Net 编码的新手,所以我很可能忘记在代码中关闭某些东西。有什么想法吗?

编辑:这是从编码为字符串的图像数据创建一系列 png 的方法。它使用 Guid 创建目录路径的唯一位,并检查以确保它不存在,然后创建目录并将图像放在那里。

看起来有问题的方法是这个:

所以犯规的方法就是这个:

    public void createImages(List<String> imageStrings)
    {
        UTF8Encoding encoding = new UTF8Encoding();
        Decoder decoder = encoding.GetDecoder();

        Guid id = Guid.NewGuid();
        String idString = id.ToString().Substring(0, 8);

        while (Directory.Exists(imageStorageRoot + idString))
        {
            id = Guid.NewGuid();
            idString = id.ToString().Substring(0, 8);
        }

        String imageDirectoryPath = imageStorageRoot + idString + "\\";
        DirectoryInfo imagePathInfo = Directory.CreateDirectory(imageDirectoryPath);

        for (int i = 0; i < imageStrings.Count; i++)
        {
            String imageString = imageStrings[i];
            Byte[] binary = Convert.FromBase64String(imageString);

            using (FileStream stream = new FileStream(imageDirectoryPath + idString + i.ToString() + ".png", FileMode.Create))
            {
                using (BinaryWriter writer = new BinaryWriter(stream))
                {
                    writer.Write(binary);
                }
            }
        }
    }

编辑 2:如果有更好的处理方法,请告诉我。我想在这里学习!

编辑 3:所以经过进一步检查,我可以注释掉所有这些代码。事实上,只要浏览器访问网站,w3wp.exe 的第二个实例就会启动。我现在想知道这是否与我们的堆栈有其他关系?它是一个 Flex 应用程序,使用 WebOrb 远程处理一些 C# 类。

有谁知道为什么 w3wp.exe 的第二个打开实例(由 NETWORK SERVICE 拥有)会阻止文件正确打开?有没有办法让它释放它保留在有问题的文件上?

【问题讨论】:

  • 可能是您的代码没有正确关闭文件,因此没有释放锁。请贴出写文件的代码。

标签: c# .net iis powerpoint w3wp.exe


【解决方案1】:

确保您在使用文件后已将其关闭(最好将访问文件的代码放在 using 语句中)。如果您需要帮助找出问题所在,请发布一些代码。

【讨论】:

  • 我发布了一些代码。如果你能看一看,我将不胜感激。
  • 其实代码看起来还不错。您确定这是发生错误的地方吗?文件是单独上传还是同时上传?在错误发生之前你执行了什么事件?
  • 嗯,我一直在做进一步的实验。如果我注释掉该方法中的所有代码,w3wp.exe 的第二个实例(由 NETWORK SERVICE 拥有)仍会启动并且不会结束。
  • 好吧,这消除了您作为罪魁祸首发布的代码(除非它也有问题)。你能调试你的解决方案吗?
  • 我可以附加到 w3wp.exe 并逐步执行代码,是的。你有什么想法?我在这里没有我的元素。
【解决方案2】:

样本看起来不错。有没有偏离代码结构?

 using (Package pptPackage = 
    Package.Open(fileName, FileMode.Open, FileAccess.ReadWrite))
  {
       // your code goes inside there
  }

如果您的代码确实包含 using 语句,您应该没问题。如果在完成后不向您的 Package 对象添加 Dispose 调用,否则您将文件打开很长时间,直到(可能)终结器将其杀死。

【讨论】:

  • 不,我保留了示例代码。我认为是我糟糕的代码导致了这个问题。我发布了有问题的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-09
  • 2013-07-09
相关资源
最近更新 更多