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

Posted

技术标签:

【中文标题】以中等信任度在 ASP.NET 中存储临时用户文件【英文标题】:Storing temporary user files in ASP.NET in medium trust 【发布时间】:2010-09-21 06:42:02 【问题描述】:

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

首先,用户输入内容并选择图片路径 当他点击预览时,信息再次显示,以便他确认 一旦确认信息将保存在数据库中

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

由于我还希望我的应用程序以中等信任度运行,因此我仅对应用程序目录具有写入权限,而在外部没有任何权限。我什至想将 ASPNET / NETWORK SERVICE 用户的写入权限限制为 ~/App_Data 文件夹。我的方案的问题是,一旦在此文件夹中创建了一个临时文件,应用程序池就会被回收,我不希望每次提交证明时都这样。

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

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

【问题讨论】:

应用程序池不应在这种情况下回收。可能是 web.config 中的输入错误? 【参考方案1】:

我会推荐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;
    

【讨论】:

是的,我在想这个。问题是,我如何清空它?毕竟它不是临时文件夹 - 而是用于长期持久性。 您可以运行一个 cron 作业来检查并清空它。 @Seb - 我知道如何在代码中执行此操作 - 我只需要定期自动完成此操作。 @Chakrit - 有点矫枉过正。我不敢相信没有其他人遇到过这样的问题。 IsolatedStorage 可能还不错,但也不是真正必要的。它使用 Windows 用户名进行隔离,这在这里不适用,对吧? @ScottStafford 我不确定。认为它使用了运行应用程序的 Windows 帐户,所以应该没有问题。【参考方案2】:

众所周知,Microsoft 提供的默认 web_mediumtrust.config 文件不实用。

这是来自默认 web_mediumtrust.config 文件的 sn-p。默认情况下,您不能使用 System.IO 发现或写入临时文件夹。

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

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

【讨论】:

【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

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

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

...有时您的应用程序池会莫名其妙地无缘无故地回收。这通常是配置问题,或者是由于您在应用程序目录中执行文件系统操作。

你确定它不应该回收吗?

【讨论】:

通常情况下,只有 bin 和 App_Code 目录中的更改会导致应用程序池回收。

以上是关于以中等信任度在 ASP.NET 中存储临时用户文件的主要内容,如果未能解决你的问题,请参考以下文章

让 NHibernate 以中等信任度处理共享主机

哪个 IOC 容器以中等信任运行

如何存储由我的 ASP.NET 模块操作的临时数据?

ASP.NET 计划删除临时文件

如何使用 Asp.net 删除临时文件

在 asp.net 中动态加载 CSS 元素