1

ファイルを保存し、App_Data ディレクトリにディレクトリを作成できる小さな asp.net MVC 1 Web アプリがあります。書き込み操作が成功したら、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();
    }
}
4

1 に答える 1

1

tempdata が null になる原因を突き止めました。DRS.Logic.Repository.Manager.CreateFile(パス、hpf、コメント); ~/App_Data/ の下に一時ディレクトリを作成し、そのディレクトリにファイルを書き込み、そのファイルをリポジトリにコミットしてから、一時ディレクトリをクリーンアップします。App_Data 内の特定の io 操作がファイルシステム モニターをトリガーし、Web アプリケーションが再起動されるようです。インプロセス セッションを使用していたため、アプリケーションが再起動するとセッションがクリアされました。Tempdata は実際にはセッションに保存されるため、同様にクリアされます。解決策: インプロセス セッションを使用したり、Web アプリケーションのルート ディレクトリの外部にファイルを保存したりしないでください。App_data の下の変更がアプリケーションの再起動を引き起こすとは思いもしませんでした。

于 2009-11-11T01:46:15.130 に答える