Stockage de fichiers d'utilisateurs temporaires dans ASP.NET dans une confiance moyenne

StackOverflow https://stackoverflow.com/questions/271944

  •  07-07-2019
  •  | 
  •  

Question

J'ai un scénario dans lequel les utilisateurs de mon application Web ASP.NET soumettent des témoignages composés d'informations textuelles et d'images. Le processus de soumission comprend les étapes suivantes:

  • D'abord, l'utilisateur entre le contenu et choisit un chemin d'accès à une image
  • Lorsqu'il clique sur l'aperçu, les informations sont à nouveau affichées pour qu'il puisse confirmer
  • Une fois confirmé, les informations sont conservées dans la base de données

Le problème, c’est que je ne souhaite pas stocker les images téléchargées dans la base de données avant la confirmation de l’utilisateur. Au lieu de cela, je les stocke en tant que fichiers temporaires et ne les mets dans la base de données qu’après confirmation finale.

Étant donné que je souhaite également que mon application s'exécute en confiance moyenne, je ne dispose d'autorisations d'écriture que dans le répertoire de l'application et nulle part ailleurs. Je souhaite même limiter les autorisations en écriture pour l'utilisateur ASPNET / NETWORK SERVICE au dossier ~ / App_Data. Le problème avec mon scénario est qu’une fois le fichier temporaire créé dans ce dossier, le pool d’applications est recyclé et je ne le souhaite pas à chaque soumission de témoignage.

Comment conseillez-vous que je garde ces fichiers temporaires à la place? Le pool n'est pas redémarré si je mets à jour un fichier - uniquement lors de la création ou du changement de nom. Mais je ne pense pas pouvoir stocker des images entières dans un seul fichier pour tous les utilisateurs. Qu'en penses-tu?

MISE À JOUR : Je dois noter que j'utilise un contrôle tiers pour le téléchargement. Cela me donne un accès programmé au flux binaire du contenu du fichier après le téléchargement, mais je ne peux pas le conserver après une deuxième publication (la première étape et la publication effectuent effectivement le téléchargement).

Était-ce utile?

La solution

Je recommanderais IsolatedStorage . C'est une sorte de dossier virtuel.

Voici un extrait de un exemple sur CodeProject :

IsolatedStorageFileStream stream = 
  new IsolatedStorageFileStream(ISOLATED_FILE_NAME, 
  FileMode.Create, isoStore);

StreamWriter writer = new StreamWriter( stream );
writer.WriteLine( "This is my first line in the isolated storage file." );
writer.WriteLine( "This is second line." );
writer.Close();

MISE À JOUR : pour nettoyer votre fichier, procédez comme suit:

string fileName = "isolatestorage.txt";

IsolatedStorageFile storage = IsolatedStorageFile.GetStore(
    IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null);

string[] files = storage.GetFileNames(fileName);
foreach(string file in files) {
    if(file == fileName) {
        storage.DeleteFile(file);
        break;
    }
}

Autres conseils

Le fichier web_mediumtrust.config par défaut fourni par Microsoft est notoirement peu pratique.

Voici un extrait du fichier web_mediumtrust.config par défaut. Par défaut, vous ne pouvez pas utiliser System.IO pour découvrir ou écrire dans le dossier temporaire.

                        <IPermission
                                class="FileIOPermission"
                                version="1"
                                Read="$AppDir<*>quot;
                                Write="$AppDir<*>quot;
                                Append="$AppDir<*>quot;
                                PathDiscovery="$AppDir<*>quot;
                        />

Bien que je n’ai pas expérimenté le stockage isolé tel que mentionné par @Seb, cela semble être autorisé par le fichier de configuration par défaut.

Vous pouvez toujours utiliser le Path.GetTempFilename normal () pour obtenir un fichier temporaire dans les scénarios ASP.NET.

Il devrait vous donner un chemin d'accès au fichier temporaire accessible en écriture par NETWORK_SERVICE mais résidant également dans l'un des dossiers temporaires de Windows, pas dans le dossier de votre application.

Si votre hôte configure correctement son serveur, cela devrait fonctionner correctement.

Ceci est une réponse à Leppie qui a commenté ma question (pour éviter la limite de caractères)

De: http://blogs.msdn.com/johan/archive/2007/05/16/common-reasons-why-your-application-pool-may-unexpectedly-recycle.aspx

  

... parfois votre pool d'applications se recycle de manière inexplicable sans raison évidente. Il s’agit généralement d’un problème de configuration ou du fait que vous exécutez des opérations sur le système de fichiers dans le répertoire de l’application.

Êtes-vous sûr que ce n'est pas censé recycler?

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