Question

Bonjour, je dois stocker des informations cachées dans un espace isolé. Pour cela j'utilise la classe System.IO.Isolated comme

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();

Cela fonctionne bien sous Windows XP, mais sur un serveur de production sous Windows 2003, une exception est indiquée

System.IO.IsolatedStorage.IsolatedStorageException: impossible de créer le répertoire de stockage.

J'ai des autorisations de contrôle total Tout le monde dans mon dossier de projet asp.net. Attention, CSoft.Core est un framework personnel créé par moi.

Ceci est ma trace de pile:

  

[IsolatedStorageException: impossible de créer le répertoire de stockage.   (Exception de HRESULT: 0x80131468)]

  System.IO.IsolatedStorage.IsolatedStorageFile.nGetRootDir (IsolatedStorageScope   portée) +0
  System.IO.IsolatedStorage.IsolatedStorageFile.InitGlobalsNonRoamingUser (IsolatedStorageScope   portée) +97
  System.IO.IsolatedStorage.IsolatedStorageFile.GetRootDir (IsolatedStorageScope   portée) +137
  System.IO.IsolatedStorage.IsolatedStorageFile.GetGlobalFileIOPerm (IsolatedStorageScope   portée) +213
  System.IO.IsolatedStorage.IsolatedStorageFile.Init (IsolatedStorageScope   portée) +56
  System.IO.IsolatedStorage.IsolatedStorageFile.GetStore (IsolatedStorageScope   scope, Type domainEvidenceType, Type assemblyEvidenceType) +59
  CSoft.Core.IO.StorageHelper.Save (String NomFichier, Contenu de la chaîne) dans   c: \ Projectos \ FrameworkCS \ CSoft.Core \ IO \ StorageHelper.cs: 18
  CSoft.Web.UI.ViewStateHelper.SerializeViewState (contexte HttpContext,   État de l'objet) dans   c: \ Projectos \ FrameworkCS \ CSoft.Web.Controls \ Web \ UI \ ViewStateHelper.cs: 65   CSoft.Web.UI.Page.SavePageStateToPersistenceMedium (état d'objet) dans   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

Était-ce utile?

La solution 3

J'ai remplacé le fichier IsolatedStorage par

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

Et ce travail.

Autres conseils

Je sais que cet utilisateur a déjà résolu son problème, mais pour les autres à la recherche d'une réponse. Ce message n’est pas parfait, mais il vous indiquera ce dont vous avez besoin pour résoudre ce problème.

Avec asp.net, GetMachineStoreForAssembly semble fonctionner dans la plupart des cas et correspond probablement au mode souhaité lors de l'utilisation d'un stockage isolé à partir d'une application Web. Parce que même si vous utilisez GetUserStoreForAssembly, il sera isolé par le compte d'utilisateur exécutant l'application asp.net et il sera toujours identique pour chaque utilisateur du site Web, à moins que vous ne mappiez d'une manière ou d'une autre chaque connexion à un utilisateur Windows (oh et si vous êtes cela fonctionnera alors).

Le problème, c’est que vous essayez ensuite d’utiliser GetUserStoreForAssembly car il a besoin d’un utilisateur disposant de droits sur le stockage isolé. L’utilisateur IIS par défaut pour les applications n’obtient pas de droits pour cela, je suppose.

Il existe 2 solutions:

  1. utilisez GetMachineStoreForAssembly

  2. Si vous devez utiliser GetUserStoreForAssembly, définissez l'application pour qu'elle s'exécute en tant qu'utilisateur doté de droits. Cela n'est pas résolu par les autorisations de dossier. Il existe plusieurs façons d’obtenir la configuration de la sécurité. (IIS7) Vous pouvez le définir dans le pool d’applications ou dans les paramètres de base > Se connecter en tant que, ou sous Authenication > Authentification anonyme. Je ne sais pas exactement de quels droits l'utilisateur a besoin, mais cela vous permettra d'aller dans la bonne direction.

Voici un code bonus qui peut vous aider à comprendre votre problème:

   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 ici: C: \ Documents and Settings \ Gabe \ Paramètres locaux \ Données d'application \ IsolatedStorage \

GetMachineStoreForAssembly est ici: C: \ Documents and Settings \ Tous les utilisateurs \ Application Data \ IsolatedStorage \

S'il fonctionne sur IIS et si NetworkService est identifié comme identité de pool d'applications, vous pouvez essayer d'accéder aux paramètres avancés du pool d'applications et définir l'option "Charger le profil utilisateur". valeur à "True". Travaillé pour moi.

Comment cela fonctionne-t-il sur le serveur? Si vous l'exécutez en tant que service sur le serveur, vous pouvez avoir un problème avec l'utilisateur affecté à exécuter le service. Assurez-vous de tester avec le même utilisateur que vous utilisez sur le serveur de production.

Comme John Saunders le demande dans son commentaire, postez davantage de traces de la pile, y compris si possible les lignes renvoyant l’exception.

Cependant, en utilisant certaines compétences de débogage psychique , je vais prendre quelques coups de couteau sauvages ici qui pourraient aider:

  1. Une exception IsolatedStorageException peut être levée par GetStore et le constructeur IsolatedStorageFileStream
  2. "Cela fonctionne correctement sous Windows XP". - lorsque vous exécutez le site dans le serveur Web intégré à Visual Studio qui s'exécute sous vos informations d'identification (probablement de l'administrateur), mais certainement en tant qu'utilisateur avec un profil, et donc un dossier de stockage isolé.
  3. "mais en production, il lève une exception" - lorsqu’il fonctionne sous l’un des "& services; Service réseau". ou un autre compte qui n'a pas de profil, ou des droits de type Interact avec Desktop (vous n'êtes pas sûr des détails - c'est principalement l'absence de profil qui tue).

Sous quel type de compte le site est-il exécuté en production? Je suppose que ce n'est pas un utilisateur capable de se connecter au serveur et d'interagir correctement avec le système de fichiers?

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