在App_Data中写入文件会导致tempdata为null

时间:2009-11-10 13:41:22

标签: asp.net asp.net-mvc tempdata appdata

我有一个小的asp.net MVC 1 Web应用程序,可以在App_Data目录中存储文件和创建目录。当写操作成功时,我向tempdata添加一条消息并执行redirectToRoute。问题是执行操作时tempdata为null。如果我将文件写入Web应用程序根目录之外的目录中,则tempdata不为null并且一切正常。为什么写在app_data中的任何想法似乎都清除了tempdata?

编辑: 如果DRS.Logic.Repository.Manager.CreateFile(path,hpf,comment)在App_Data中写入,则TempData将在重定向到的操作中为null。如果它是Web应用程序根目录之外的目录,那就没问题。没有例外被抛出。

[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(int id, string path, FormCollection form)
{
    ViewData["path"] = path;
    ViewData["id"] = id;

    HttpPostedFileBase hpf;

    string comment = form["FileComment"];
    hpf = Request.Files["File"] as HttpPostedFileBase;

    if (hpf.ContentLength != 0)
    {
        DRS.Logic.Repository.Manager.CreateFile(path, hpf, comment);
        TempData["notification"] = "file was created";
        return RedirectToRoute(new { controller = "File", action ="ViewDetails", id = id, path = path + Path.GetFileName(hpf.FileName) });
    }
    else
    {
        TempData["notification"] = "No file were selected.";
        return View();
    }
}

1 个答案:

答案 0 :(得分:1)

找出导致tempdata变为null的原因。 DRS.Logic.Repository.Manager.CreateFile(path,hpf,comment);在〜/ App_Data /下创建一个临时目录,在该目录中写入文件,将该文件提交到存储库,然后清理临时目录。似乎App_Data中的某些io操作会触发文件系统监视器并重新启动Web应用程序。我正在使用inproc会话,因此当应用程序重新启动时,会话将被清除。 Tempdata实际上存储在会话中,因此它也被清除。解决方案:不要使用inproc会话或存储Web应用程序根目录之外的文件。我不知道App_data下的更改会触发应用程序重启。