Pregunta

Hola, tengo que almacenar información oculta en un espacio aislado. Para eso estoy usando la clase System.IO.Isolated como

IsolatedStorageFile isf =     System.IO.IsolatedStorage.IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Assembly, null, null);
Stream writer = new IsolatedStorageFileStream(filename, FileMode.Create, isf);

IFormatter formatter = new BinaryFormatter();
formatter.Serialize(writer, appCollection.ToString());

writer.Close();

Funciona bien en Windows XP pero en el servidor de producción que es Windows 2003 muestra excepción

System.IO.IsolatedStorage.IsolatedStorageException: no se puede crear el directorio de la tienda.

Tengo permisos de Control total para todos en mi carpeta de proyecto asp.net. Atención CSoft.Core es un Framework personal creado por mí.

Este es mi seguimiento de pila:

  

[IsolatedStorageException: no se puede crear el directorio de la tienda.   (Excepción de HRESULT: 0x80131468)]
  System.IO.IsolatedStorage.IsolatedStorageFile.nGetRootDir (IsolatedStorageScope   alcance) +0
  System.IO.IsolatedStorage.IsolatedStorageFile.InitGlobalsNonRoamingUser (IsolatedStorageScope   alcance) +97
  System.IO.IsolatedStorage.IsolatedStorageFile.GetRootDir (IsolatedStorageScope   alcance) +137
  System.IO.IsolatedStorage.IsolatedStorageFile.GetGlobalFileIOPerm (IsolatedStorageScope   alcance) +213
  System.IO.IsolatedStorage.IsolatedStorageFile.Init (IsolatedStorageScope   alcance) +56
  System.IO.IsolatedStorage.IsolatedStorageFile.GetStore (IsolatedStorageScope   ámbito, Tipo dominioEvidenciaTipo, Tipo ensambladoEvidenciaTipo) +59
  CSoft.Core.IO.StorageHelper.Save (String fileName, String content) en   c: \ Projectos \ FrameworkCS \ CSoft.Core \ IO \ StorageHelper.cs: 18
  CSoft.Web.UI.ViewStateHelper.SerializeViewState (contexto HttpContext,   Estado del objeto) en   c: \ Projectos \ FrameworkCS \ CSoft.Web.Controls \ Web \ UI \ ViewStateHelper.cs: 65   CSoft.Web.UI.Page.SavePageStateToPersistenceMedium (estado del objeto) en   c: \ Projectos \ FrameworkCS \ CSoft.Web.Controls \ Web \ UI \ Page.cs: 302
  System.Web.UI.Page.SaveAllState () +236
  System.Web.UI.Page.ProcessRequestMain (Boolean   includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)   +1099

¿Fue útil?

Solución 3

Cambié el archivo IsolatedStorage a

using (IsolatedStorageFile isoStore = IsolatedStorageFile.GetMachineStoreForAssembly ())             {}

Y este trabajo.

Otros consejos

Sé que este usuario ya resolvió su problema, pero para otros que buscan una respuesta. Esta publicación no es perfecta, pero le indicará lo que necesita para resolver este problema.

Con asp.net GetMachineStoreForAssembly parece funcionar en la mayoría de los casos, y probablemente sea el modo deseado cuando se usa almacenamiento aislado desde una aplicación web. Porque incluso si usa GetUserStoreForAssembly, estará aislado por la cuenta de usuario que ejecuta la aplicación asp.net y siempre será la misma para cada usuario del sitio web, a menos que de alguna manera esté asignando cada inicio de sesión a un usuario de Windows (ah y si está haciendo esto, entonces estaría funcionando).

El problema es que intentas usar GetUserStoreForAssembly porque necesita un usuario con derechos de almacenamiento aislado, el usuario predeterminado de IIS para aplicaciones no obtiene derechos para esto, supongo.

Hay 2 soluciones:

  1. use GetMachineStoreForAssembly

  2. Si debe usar GetUserStoreForAssembly, configure la aplicación para que se ejecute como usuario con derechos. Esto no se resuelve con permisos de carpeta. Hay varias formas de obtener la configuración de seguridad. (IIS7) Puede configurarlo en el grupo de aplicaciones o en la configuración básica > Conectar como, o bajo Autenticación > Autenticación anónima. No estoy seguro de qué derechos necesita exactamente el usuario, pero esto lo llevará a la dirección correcta.

Aquí hay un código de bonificación que puede ayudarlo a resolver su problema:

   Dim storageFile As IsolatedStorageFile
    If Request("storage") = "user" Then
        storageFile = IsolatedStorageFile.GetUserStoreForAssembly()
    Else
        storageFile = IsolatedStorageFile.GetMachineStoreForAssembly()
    End If

    Response.Write(storageFile.GetType.GetField("m_RootDir", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance).GetValue(storageFile).ToString())

GetUserStoreForAssembly está aquí: C: \ Documents and Settings \ Gabe \ Configuración local \ Datos de aplicación \ Almacenamiento aislado \

GetMachineStoreForAssembly está aquí: C: \ Documentos y configuraciones \ Todos los usuarios \ Datos de aplicación \ Almacenamiento aislado \

Si se está ejecutando en IIS y la identidad del grupo de aplicaciones es NetworkService, puede intentar ir a la configuración avanzada del grupo de aplicaciones y establecer "Cargar perfil de usuario". valor a "Verdadero". Trabajó para mí.

¿Cómo está ejecutando esto en el servidor? Si lo está ejecutando como un servicio en el servidor, es posible que tenga un problema con el usuario asignado para ejecutar el servicio. Asegúrese de probar con el mismo usuario que está utilizando en el servidor de producción.

Como John Saunders pregunta en su comentario, publique más de la traza de la pila, incluyendo, si es posible, las líneas que arrojan la excepción.

Sin embargo, usando algunas habilidades de depuración psíquica , voy a tomar un par de puñaladas salvajes aquí que podrían ayudar:

  1. IsolatedStorageException puede ser lanzado por GetStore y el Constructor IsolatedStorageFileStream
  2. " Funciona bien en Windows XP " - cuando ejecuta el sitio en el servidor web integrado de Visual Studio que se ejecuta bajo sus credenciales (probablemente de administrador), pero ciertamente como un usuario con un perfil y, por lo tanto, una carpeta de almacenamiento aislado.
  3. " Pero en la producción arroja una excepción " - cuando se ejecuta bajo " Servicio de red " o alguna otra cuenta que no tenga un perfil, o interactúe con los derechos de tipo Escritorio (no estoy seguro de los detalles, es principalmente la falta de un perfil lo que mata).

¿En qué tipo de cuenta se está ejecutando el sitio en producción? ¿Asumo que no es un usuario que puede iniciar sesión en el servidor e interactuar con el sistema de archivos correctamente?

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