我有一个 Web 应用程序。它将一系列图像发送到服务器(那里没有问题),然后使用本教程中的代码创建 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 拥有)会阻止文件正确打开?有没有办法让它释放它保留在有问题的文件中?