w3wp.exe(网络服务用户)正在锁定新创建的文件并阻止对它的访问

本文关键字:文件 访问 创建 新创建 用户 网络服务 exe w3wp 锁定 | 更新日期: 2023-09-27 18:17:47

我有一个Web应用程序。它向服务器发送一系列图像(没有问题),然后使用本教程中的代码创建一个PowerPoint演示文稿。演示文稿保存在web服务器上的一个目录中,URL返回给用户。

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

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

我是这个。net编码的新手,所以很有可能我忘记在代码中关闭一些东西。什么好主意吗?

Edit:这个方法从编码成字符串的图像数据中创建一系列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:如果有更好的方法来做事情,请告诉我。我正在努力学习呢!

Edit 3:因此,经过进一步检查,我可以注释掉所有这些代码。事实上,w3wp.exe的第二个实例在浏览器点击网站时就会启动。我现在想知道这是否与我们的堆栈有其他关系?这是一个Flex应用程序,使用webb来远程访问一些c#类。

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

w3wp.exe(网络服务用户)正在锁定新创建的文件并阻止对它的访问

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

样品看起来不错。你是否偏离了代码结构?

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

如果你的代码确实包含using语句,你应该没问题。如果没有在完成时向Package对象添加Dispose调用,或者您将使文件长时间打开,直到(可能)终结器终止它。