IsolatedStorageException: imansible creare la directory del negozio

Salve, devo memorizzare alcune informazioni nascoste nello spazio isolato. Per questo sto usando la class System.IO.Isolated come

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

Funziona bene in Windows XP ma sul server di produzione che è Windows 2003 mostra un’eccezione

System.IO.IsolatedStorage.IsolatedStorageException: imansible creare la directory del negozio.

Dispongo di tutte le autorizzazioni di controllo completo nella cartella del mio progetto asp.net. Attenzione CSoft.Core è un framework personale creato da me.

Questa è la mia traccia di stack:

[IsolatedStorageException: imansible creare la directory del negozio. (Eccezione da HRESULT: 0x80131468)]
System.IO.IsolatedStorage.IsolatedStorageFile.nGetRootDir (ambito IsolatedStorageScope) +0
System.IO.IsolatedStorage.IsolatedStorageFile.InitGlobalsNonRoamingUser (ambito IsolatedStorageScope) +97
System.IO.IsolatedStorage.IsolatedStorageFile.GetRootDir (ambito IsolatedStorageScope) +137
System.IO.IsolatedStorage.IsolatedStorageFile.GetGlobalFileIOPerm (ambito IsolatedStorageScope) +213
System.IO.IsolatedStorage.IsolatedStorageFile.Init (ambito IsolatedStorageScope) +56
System.IO.IsolatedStorage.IsolatedStorageFile.GetStore (ambito IsolatedStorageScope, Tipo domainEvidenceType, Tipo assemblyEvidenceType) +59
CSoft.Core.IO.StorageHelper.Save (String fileName, String content) in c: \ Projectos \ FrameworkCS \ CSoft.Core \ IO \ StorageHelper.cs: 18
CSoft.Web.UI.ViewStateHelper.SerializeViewState (contesto HttpContext, stato dell’object) in c: \ Projectos \ FrameworkCS \ CSoft.Web.Controls \ Web \ UI \ ViewStateHelper.cs: 65 CSoft.Web.UI.Page.SavePageStateToPersistenceMedium (object stato) in 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

So che questo utente ha già risolto il problema, ma per gli altri in cerca di una risposta. Questo post non è perfetto, ma ti indicherà ciò di cui hai bisogno per risolvere questo problema.

Con asp.net, GetMachineStoreForAssembly sembra funzionare nella maggior parte dei casi e probabilmente è la modalità desiderata quando si utilizza lo storage isolato da un’app Web. Perché anche se utilizzi GetUserStoreForAssembly, verrà isolato dall’account utente che esegue l’app asp.net e sarà sempre lo stesso per ogni utente del sito Web, a meno che tu non stia mappando in qualche modo ogni accesso a un utente Windows (oh e se lo sei facendo questo allora funzionerebbe).

Il problema è che si tenta di utilizzare GetUserStoreForAssembly perché ha bisogno di un utente con diritti per l’archiviazione isolata, l’utente IIS predefinito per le applicazioni non ottiene i diritti per questo, credo.

Ci sono 2 soluzioni:

  1. utilizzare GetMachineStoreForAssembly

  2. Se è necessario utilizzare GetUserStoreForAssembly, impostare l’app per l’esecuzione come utente con diritti. Questo non è risolto dalle autorizzazioni della cartella. Esistono diversi modi per ottenere l’impostazione della sicurezza. (IIS7) È ansible impostarla nel pool di app o nelle impostazioni di base> Connetti come, oppure in Autenicazione> Autenticazione anonima. Non sono sicuro di quali siano i diritti dell’utente, ma questo ti porterà nella giusta direzione.

Ecco alcuni codici bonus che potrebbero aiutarti a capire il tuo 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 è qui: C: \ Documents and Settings \ Gabe \ Impostazioni locali \ Dati applicazioni \ IsolatedStorage \

GetMachineStoreForAssembly è qui: C: \ Documents and Settings \ All Users \ Dati applicazioni \ IsolatedStorage \

Se è in esecuzione su IIS e l’id quadro del pool di applicazioni è NetworkService, è ansible provare ad accedere alle impostazioni avanzate del pool di applicazioni e impostare il valore “Carica profilo utente” su “Vero”. Ha funzionato per me

Ho cambiato il file IsolatedStorage in

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

E questo lavoro.

Come stai eseguendo questo sul server? Se lo stai eseguendo come servizio sul server, potresti avere un problema con l’utente assegnato per eseguire il servizio. Assicurati di testare con lo stesso utente che stai utilizzando sul server di produzione.

Come John Saunders chiede nel suo commento, per favore pubblica più tracce dello stack, incluse, se ansible, le righe che lanciano l’espirazione.

Tuttavia, usando alcune abilità di debug psichico , ho intenzione di fare un paio di pugnalate selvagge qui che potrebbero aiutare:

  1. IsolatedStorageException può essere generata da GetStore e dal costruttore IsolatedStorageFileStream
  2. “Funziona bene in Windows XP” – quando si esegue il sito in Visual Studio integrato nel server Web in esecuzione con le credenziali dell’utente (probabilmente admin), ma sicuramente come utente con un profilo e, quindi, una cartella di archiviazione isolata.
  3. “Ma in produzione getta un’eccezione” – quando è in esecuzione in “Servizio di rete” o in qualche altro account che non ha un profilo, o Interagisci con i diritti di tipo Desktop (non sono sicuro delle specifiche – è principalmente la mancanza di un profilo che è un killer).

Che tipo di account è in esecuzione il sito in produzione? Presumo che non sia un utente in grado di accedere al server e interagire correttamente con il file system?