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

C# w3wp.exe(网络服务用户)正在锁定新创建的文件并阻止访问该文件,c#,.net,iis,powerpoint,w3wp.exe,C#,.net,Iis,Powerpoint,W3wp.exe,我有一个Web应用程序。它将一系列图像发送到服务器(没有问题),然后使用中的代码创建PowerPoint演示文稿。演示文稿保存在web服务器上的一个目录中,URL将返回给用户 但是,该文件仍在使用中,尝试访问它会在IIS 7.5中生成500.0错误 如果打开任务管理器并终止属于网络服务用户的w3wp.exe进程,则一切正常(可以下载和查看该文件)。我还有另一个属于DefaultAppPool的w3wp进程,但它似乎没有引起问题 我不熟悉这个.Net编码,所以我很可能忘记关闭代码中的某些内容。有什

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

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

如果打开任务管理器并终止属于网络服务用户的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);
                }
            }
        }
    }
因此,令人不快的方法是:

    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);
                }
            }
        }
    }
public void createImages(列出imageStrings)
{
UTF8Encoding=新的UTF8Encoding();
解码器=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);
}
字符串imageDirectoryPath=imageStorageRoot+idString+“\\”;
DirectoryInfo imagePathInfo=目录.CreateDirectory(imageDirectoryPath);
for(int i=0;i
编辑2:如果对做事有更好的建议,请告诉我。我在这里努力学习

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


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

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

示例看起来不错。您是否偏离了代码结构

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

如果您的代码确实包含using语句,那么您应该不会有问题。如果不在完成后向包对象添加Dispose调用,则会将文件保持打开状态很长一段时间,直到(可能)终结器将其终止。

很可能是您的代码没有正确关闭文件,因此没有释放锁。请把写文件的代码贴出来。我贴了一些代码。如果你能看一看,我会很感激的。实际上代码看起来很不错。您确定这是发生错误的地方吗?文件是单独上传还是同时上传?在错误发生之前,你会执行什么事件?嗯,我一直在做进一步的实验。如果我注释掉该方法中的所有代码,w3wp.exe的第二个实例(由网络服务拥有)仍然会启动,并且不会结束。这就消除了您作为罪魁祸首发布的代码(除非它也有问题)。你能调试你的解决方案吗?我可以连接到w3wp.exe并逐步完成代码,是的。你有什么想法吗?我不在这里了。不,我把样本的代码原封不动地留下了。我认为是我糟糕的代码导致了这个问题。我发布了令人不快的代码。