2009-11-10 3 views
1

У меня есть небольшое веб-приложение asp.net MVC 1, которое может хранить файлы и создавать каталоги в каталоге App_Data. Когда операция записи завершается успешно, я добавляю сообщение в tempdata и делаю redirectToRoute. Проблема в том, что tempdata имеет значение null, когда действие выполняется. Если я пишу файлы в каталоге за пределами корневого каталога веб-приложений, tempdata не является нулевым, и все работает правильно. Любые идеи, почему запись в app_data, кажется, очищает tempdata?Запись файлов в App_Data вызывает ошибку tempdata

Редактировать: если DRS.Logic.Repository.Manager.CreateFile (путь, hpf, комментарий) записывается в App_Data, TempData будет null в перенаправленном действии. если это каталог из корня веб-приложения, это нормально. Никакие исключения не бросаются.

[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(); 
    } 
} 
+0

Пожалуйста, разместите код, вы все еще используете RedirectToRoute, когда пишете в другой каталог? – Lazarus

+0

Да, я все еще использую redirecttoroute. код, который записывает фактический файл, является простым и не вызывает каких-либо исключений. Мы попробовали redirectToAction с теми же результатами. – RAMX

ответ

1

Выяснено, что заставило tempdata стать нулевым. DRS.Logic.Repository.Manager.CreateFile (путь, hpf, комментарий); создает каталог temp в ~/App_Data /, записывает файл в этот каталог, передает этот файл в репозиторий и затем очищает временную директорию. Похоже, что некоторые операции io внутри App_Data запускают монитор файловой системы, и веб-приложение перезапускается. Я использовал сессию inproc, поэтому, когда приложение перезапустится, сеанс будет очищен. Tempdata фактически хранится в сеансе, поэтому он также очищается. Решение: не используйте сеанс inproc или храните файлы вне корневого каталога веб-приложения. Я понятия не имел, что изменения в App_data вызвали перезапуск приложения.

+1

Huh. Вы говорите, что запись в app_data вызвала перезапуск приложения? Каковы определенные операции ввода-вывода? Было бы интересно посмотреть, что на самом деле сообщает ASP.Net: http://weblogs.asp.net/scottgu/archive/2005/12/14/433194.aspx – a7drew

+2

Кажется, что операция ввода-вывода, вызывающая перезагрузку, удаляет папку , – jhexp

+0

прошел через тот же сценарий. Но мое дело было в папке bin, я пытаюсь создать папку и записать файлы внутри нее, но это приводит к тому, что совпадающий словарь всегда равен нулю –