Domanda

Salve, devo conservare alcune informazioni nascoste nello spazio isolato. Per questo sto usando la classe 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: impossibile creare la directory del negozio.

Ho i permessi di controllo completo di Everyone nella mia cartella di progetto asp.net. Attenzione CSoft.Core è un framework personale creato da me.

Questa è la mia traccia dello stack:

  

[IsolatedStorageException: impossibile creare la directory del negozio.   (Eccezione da HRESULT: 0x80131468)]
  System.IO.IsolatedStorage.IsolatedStorageFile.nGetRootDir (IsolatedStorageScope   ambito di applicazione) +0
  System.IO.IsolatedStorage.IsolatedStorageFile.InitGlobalsNonRoamingUser (IsolatedStorageScope   campo di applicazione) +97
  System.IO.IsolatedStorage.IsolatedStorageFile.GetRootDir (IsolatedStorageScope   campo di applicazione) +137
  System.IO.IsolatedStorage.IsolatedStorageFile.GetGlobalFileIOPerm (IsolatedStorageScope   campo di applicazione) +213
  System.IO.IsolatedStorage.IsolatedStorageFile.Init (IsolatedStorageScope   campo di applicazione) +56
  System.IO.IsolatedStorage.IsolatedStorageFile.GetStore (IsolatedStorageScope   scope, Type domainEvidenceType, Type 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'oggetto) in   c: \ Projectos \ FrameworkCS \ CSoft.Web.Controls \ Web \ UI \ ViewStateHelper.cs: 65   CSoft.Web.UI.Page.SavePageStateToPersistenceMedium (stato oggetto) in   c: \ Projectos \ FrameworkCS \ CSoft.Web.Controls \ Web \ UI \ Page.cs: 302
  System.Web.UI.Page.SaveAllState () +236
  System.Web.UI.Page.ProcessRequestMain (booleano   includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)   1099

È stato utile?

Soluzione 3

Ho cambiato il file IsolatedStorage in

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

E questo lavoro.

Altri suggerimenti

So che questo utente ha già risolto il problema, ma per gli altri alla ricerca 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 l'archiviazione isolata da un'app Web. Perché anche se usi GetUserStoreForAssembly, sarà 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 in qualche modo mappando ogni accesso a un utente di Windows (oh e se lo sei facendo questo allora funzionerebbe).

Il problema è quindi provare a utilizzare GetUserStoreForAssembly perché necessita di un utente con diritti di archiviazione isolata, suppongo che l'utente IIS predefinito per le applicazioni non abbia i diritti per questo.

Esistono 2 soluzioni:

  1. usa GetMachineStoreForAssembly

  2. Se è necessario utilizzare GetUserStoreForAssembly impostare l'app per l'esecuzione come utente con diritti. Questo non è risolto dai permessi delle cartelle. Esistono diversi modi per ottenere la configurazione della sicurezza. (IIS7) Puoi impostarlo nel pool di app o nelle impostazioni di base > Connetti come o in Authenication > Autenticazione anonima. Non sono sicuro di quali diritti l'utente abbia bisogno, ma questo ti farà andare nella giusta direzione.

Ecco un codice bonus che può 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 \ Tutti gli utenti \ Dati applicazioni \ IsolatedStorage \

Se è in esecuzione su IIS e l'identità del pool di applicazioni è NetworkService, puoi provare ad accedere alle impostazioni avanzate del pool di applicazioni e impostare " Carica profilo utente " valore su " True " ;. Ha funzionato per me.

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

Come John Saunders chiede nel suo commento, si prega di pubblicare più traccia dello stack, comprese se possibile le linee che generano l'aspettativa.

Tuttavia, utilizzando alcune abilità di debug psichico , prenderò un paio di pugnalate selvagge che potrebbero aiutare:

  1. IsolatedStorageException può essere generato sia da GetStore che da IsolatedStorageFileStream costruttore
  2. " Funziona bene in Windows XP " - quando si esegue il sito nel server Web incorporato di Visual Studio in esecuzione con le proprie credenziali (probabilmente admin), ma sicuramente come utente con un profilo e quindi una cartella di archiviazione isolata.
  3. " Ma sulla produzione genera un'eccezione " - quando funziona con " Servizio di rete " o 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).

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top