Pregunta

Tengo un escenario en el que los usuarios de mi aplicación web ASP.NET envían testimonios que consisten en información de texto e imágenes. El proceso de envío tiene los siguientes pasos:

  • Primero, el usuario ingresa el contenido y elige una ruta a una imagen
  • Cuando hace clic en vista previa, la información se muestra una vez más para que pueda confirmar
  • Una vez confirmada, la información persiste en la base de datos

El problema con esto es que no quiero almacenar imágenes cargadas en la base de datos antes de que el usuario realmente confirme. En cambio, los guardo como archivos temporales y los pongo en la base de datos solo después de la confirmación final.

Como también quiero que mi aplicación se ejecute con una confianza media, solo tengo permisos de escritura en el directorio de la aplicación y en ningún lugar externo. Incluso quiero limitar los permisos de escritura para el usuario de ASPNET / NETWORK SERVICE a la carpeta ~ / App_Data. El problema con mi escenario es que una vez que se crea un archivo temporal en esta carpeta, el grupo de aplicaciones se recicla y no quiero que en cada envío de testimonios.

¿Cómo aconseja que conserve estos archivos temporales en su lugar? El grupo no se reinicia si actualizo un archivo, solo en crear o cambiar el nombre. Pero no creo que pueda almacenar imágenes completas en un solo archivo para todos los usuarios. ¿Qué te parece?

ACTUALIZACIÓN : debo tener en cuenta que estoy usando un control de terceros para la carga. Me da acceso programático a la secuencia binaria del contenido del archivo después de la carga, pero no puedo mantener esto después de una segunda devolución de datos (el primer paso y la devolución de datos realmente hacen la carga).

¿Fue útil?

Solución

Recomendaría IsolatedStorage . Es una especie de carpeta virtual.

Aquí hay un extracto de un ejemplo en 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();

ACTUALIZACIÓN : para limpiar su archivo simplemente haga esto:

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;
    }
}

Otros consejos

El archivo web_mediumtrust.config predeterminado que Microsoft envía es notoriamente poco práctico.

Aquí hay un fragmento del archivo predeterminado web_mediumtrust.config. De forma predeterminada, no puede usar System.IO para descubrir o escribir en la carpeta temporal.

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

Aunque no he experimentado con el almacenamiento aislado como lo menciona @Seb, parece que está permitido por el archivo de configuración predeterminado.

Todavía puede usar el Path.GetTempFilename normal () método para obtener un archivo temporal en escenarios ASP.NET.

Debería proporcionarle una ruta de archivo temporal que NETWORK_SERVICE pueda escribir pero que también se encuentre en una de las carpetas temporales de Windows, no en la carpeta de su aplicación.

Si su host configuró su servidor correctamente, eso debería funcionar bien.

Esta es una respuesta a Leppie que comentó mi pregunta (para evitar el límite de char)

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

  

... a veces su grupo de aplicaciones se recicla inexplicablemente sin razón aparente. Esto suele ser un problema de configuración o debido al hecho de que está realizando operaciones del sistema de archivos en el directorio de la aplicación.

¿Estás seguro de que no debe reciclarse?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top