2009-11-10 15 views
1

J'ai une petite application Web asp.net MVC 1 qui peut stocker des fichiers et créer des répertoires dans le répertoire App_Data. Quand l'opération d'écriture réussit, j'ajoute un message à la tempdata et fais un redirectToRoute. Le problème est que la tempdata est nulle lorsque l'action est exécutée. Si j'écris les fichiers dans un répertoire en dehors du répertoire racine des applications Web, la tempdata n'est pas nulle et tout fonctionne correctement. Des idées pourquoi écrire dans l'app_data semble effacer la tempdata?L'écriture de fichiers dans App_Data entraîne la nullité des données temporaires

éditer: si DRS.Logic.Repository.Manager.CreateFile (chemin, hpf, commentaire) écrit dans l'App_Data, TempData sera nul dans l'action en cours de redirection. si c'est un répertoire hors de la racine de l'application web, c'est bien. Aucune exception n'est levée.

[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

Veuillez publier le code, utilisez-vous toujours RedirectToRoute lorsque vous écrivez dans un répertoire différent? – Lazarus

+0

oui j'utilise toujours redirecttoroute. le code qui écrit le fichier réel est simple et ne jette aucune exception. Nous avons essayé redirectToAction avec les mêmes résultats. – RAMX

Répondre

1

On a découvert ce qui provoquait des données de type tempo. DRS.Logic.Repository.Manager.CreateFile (chemin, hpf, commentaire); crée un répertoire temporaire sous ~/App_Data /, écrit un fichier dans ce répertoire, valide ce fichier dans un référentiel, puis nettoie le répertoire temporaire. Il semble que certaines opérations io dans App_Data déclenchent le contrôle du système de fichiers et que l'application Web soit redémarrée. J'utilisais une session inproc donc quand l'application redémarrerait, la session serait effacée. Tempdata est actuellement stocké dans la session, de sorte qu'il a également été effacé. solution: ne pas utiliser la session inproc ou stocker des fichiers en dehors du répertoire racine de l'application Web. Je n'avais aucune idée que les changements sous App_data ont déclenché un redémarrage de l'application.

+1

Huh. Vous dites que l'écriture dans app_data a provoqué le redémarrage de l'application? Quelles sont les certaines opérations d'E/S? Il serait intéressant de voir ce qu'ASP.Net a effectivement rapporté: http://weblogs.asp.net/scottgu/archive/2005/12/14/433194.aspx – a7drew

+2

Il semble que l'opération d'E/S provoquant le redémarrage supprime un dossier . – jhexp

+0

traversé avec le même scénario. Mais mon cas était dans le dossier bin, j'essaie de créer un dossier et d'écrire des fichiers à l'intérieur, mais cela fait que le dictionnaire concurrent est toujours null –