Question

Notez que je ne parle pas des "Fichiers ASP.NET temporaires" générés par le compilateur.

Mon application Web (ASP.NET MVC) utilise Graphviz pour générer des images qui sont ensuite transmises au client. Cela nécessite la création de fichiers temporaires.

Quelle est la meilleure façon de traiter ces problèmes? Est-il possible de les supprimer immédiatement après leur envoi? Devrais-je utiliser un fil de fond? Quelque chose dans Application_Start ou Application_Fin?

Était-ce utile?

La solution

Ne pourriez-vous pas le faire via un contrôleur ou utiliser un ASHX ( http://www.marklio.com/marklio/CommentView,guid,df8d6471-83fd-4f66-a799-ef8274979f0e.aspx ) pour diffuser le contenu et supprimer les fichiers temporaires une fois vous aviez fini d'écrire le flux?

Autres conseils

Graphviz crée le client et les ajoute sous forme de lien dans la page. vous ne pouvez donc pas les supprimer directement.

il y a plusieurs façons:

  • au démarrage de l'application, personne ne devrait utiliser l'une de ces images. afin que vous puissiez le supprimer
  • vous ajoutez une référence à l'image (le chemin, par exemple) au cache et ajoutez un CacheItemRemovedCallback qui supprimera votre image. (limite bien la quantité d’images sur votre disque dur
  • faire une minuterie, qui supprime les éléments périodiquement

Sachez que vous ne devez pas supprimer les images créées il y a une seconde à peine. car ils peuvent être utilisés.

Utilisez la méthode décrite par un autre utilisateur , mais demandez au navigateur d'utiliser son cache s'il souhaite récupérer l'image en configurant la Entête Last-Modifed dans la réponse puis dans le gestionnaire d'images si vous obtenez un En-tête If-Modified-Since, le gestionnaire doit répondre avec le code d’état 304 "NON modifié". De cette façon, l'image est toujours affichée tant que le navigateur client n'a pas effacé son cache.

J'aime traiter les fichiers temporaires créés par une action dans la même action que ceux qui les génèrent. Par exemple: (dans MVC, mais cela pourrait s’appliquer à n’importe quel framework)

public ActionResult Foo()
{
    FooCleanup(); // deletes files in "~/temp/Foo/" older than a day or so

    string filename = CreateTemporaryFile(); // Creates a temporary file like "~/temp/Foo/{timestamp}.foo"
    return File(filename);
}

Si Foo () est souvent appelé, vous pouvez ajouter de la logique au nettoyage des appels uniquement de temps en temps. C'est un peu comme le travail cron d'un pauvre, mais cela fonctionne bien.

nous utilisons application_start avec une sorte de minuterie à exécuter toutes les 24 heures et nettoyons / supprimons le dossier de fichiers temporaires une fois par jour.

Vous pouvez créer un gestionnaire (.ashx) et diffuser le fichier temporaire à travers celui-ci. Ainsi, vous saurez que le fichier a été transféré sur le client et vous pouvez supprimer le fichier temporaire à la fin du gestionnaire.

Un problème possible est que le client ne pourra pas télécharger le fichier deux fois, car vous le supprimez immédiatement. (Ce qui pourrait ensuite être atténué à l'aide du cache de sortie de page ...)

Bien que la meilleure chose à faire serait d'éviter tout problème lié au fichier temporaire et de le diffuser à la demande, en le générant dans le gestionnaire ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top