以中等信任的方式在ASP.NET中存储临时用户文件

时间:2008-11-07 12:42:15

标签: asp.net file-io medium-trust

我有一个场景,我的ASP.NET Web应用程序的用户提交包含文本信息和图像的推荐。提交过程包括以下步骤:

  • 首先,用户输入内容并选择图像路径
  • 当他点击预览时,会再次显示该信息,以便他确认
  • 确认后,信息将保留在数据库中

这个问题是我不希望在用户实际确认之前将上传的图像存储在数据库中。相反,我将它们存储为临时文件,并在最终确认后将它们放入DB中。

由于我还希望我的应用程序以中等信任的方式运行,因此我只对应用程序目录具有写权限,而且不在外面。我甚至想将ASPNET / NETWORK SERVICE用户的写权限限制在〜/ App_Data文件夹中。我的方案的问题是,一旦在此文件夹中创建了一个临时文件,应用程序池就会被回收,我不希望每个提示都提交。

你如何建议我保留这些临时文件?如果我更新文件,则不会重新启动池 - 仅在创建或重命名时。但我不认为我可以将整个图像存储在一个文件中供所有用户使用。你觉得怎么样?

更新:我应该注意,我正在使用第三方控件进行上传。它允许我在上传后以编程方式访问文件内容的二进制流,但是在第二次回发之后我无法保留它(第一步和回发实际上进行了上传)。

4 个答案:

答案 0 :(得分:5)

我会推荐IsolatedStorage。这是一种虚拟文件夹。

以下摘自an example on CodeProject

IsolatedStorageFileStream stream = 
  new IsolatedStorageFileStream(ISOLATED_FILE_NAME, 
  FileMode.Create, isoStore);

StreamWriter writer = new StreamWriter( stream );
writer.WriteLine( "This is my first line in the isolated storage file." );
writer.WriteLine( "This is second line." );
writer.Close();

更新:要清理文件,请执行以下操作:

string fileName = "isolatestorage.txt";

IsolatedStorageFile storage = IsolatedStorageFile.GetStore(
    IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null);

string[] files = storage.GetFileNames(fileName);
foreach(string file in files) {
    if(file == fileName) {
        storage.DeleteFile(file);
        break;
    }
}

答案 1 :(得分:2)

您仍然可以使用普通的Path.GetTempFilename()方法在ASP.NET方案中获取临时文件。

它应该为您提供一个可由NETWORK_SERVICE写入的临时文件路径,但它也存在于一个实际的Windows临时文件夹中,而不是您的应用程序文件夹中。

如果你的主机正确配置了他的服务器,那应该可以正常工作。

答案 2 :(得分:2)

Microsoft提供的默认web_mediumtrust.config文件非常不切实际。

以下是默认web_mediumtrust.config文件的代码段。默认情况下,您无法使用System.IO来发现或写入临时文件夹。

                        <IPermission
                                class="FileIOPermission"
                                version="1"
                                Read="$AppDir$"
                                Write="$AppDir$"
                                Append="$AppDir$"
                                PathDiscovery="$AppDir$"
                        />

虽然我没有对@Seb提到的隔离存储进行过实验,但默认的配置文件似乎允许这样做。

答案 3 :(得分:0)

这是对Leppie的回复,他对我的问题发表了评论(以避免限制字符)

来自:http://blogs.msdn.com/johan/archive/2007/05/16/common-reasons-why-your-application-pool-may-unexpectedly-recycle.aspx

  

...有时你的应用程序池无法解释,没有明显的原因。这通常是配置问题,或者是由于您在应用程序目录中执行文件系统操作。

你确定它不应该回收吗?