我有一个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拥有)会阻止文件正常打开?有没有办法让它释放它对相关文件的保留?
答案 0 :(得分:3)
确保在使用文件后关闭了文件(更好的是将使用语句访问文件的代码放在一起)。如果您需要帮助确定问题所在,请发布一些代码。
答案 1 :(得分:0)
样本看起来不错。你偏离了代码结构吗?
using (Package pptPackage =
Package.Open(fileName, FileMode.Open, FileAccess.ReadWrite))
{
// your code goes inside there
}
如果您的代码确实包含using语句,那么您应该没问题。如果没有在完成后向您的Package对象添加Dispose调用,或者您将文件保持打开很长时间,直到(可能)终结器将其终止。