2009-06-23 17 views
4

Hi Ich muss einige versteckte Informationen im isolierten Bereich speichern. Dafür verwende ich System.IO.Isolated Klasse wieIsolatedStorageException: Das Filialverzeichnis konnte nicht erstellt werden

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

es in Windows XP funktioniert gut, aber auf dem Produktionsserver, auf dem Windows 2003 ist es zeigt Ausnahme

System.IO.IsolatedStorage.IsolatedStorageException: Kann nicht Erstellen Sie das Geschäftsverzeichnis.

Ich habe eine vollständige Kontrolle Berechtigungen in meinem asp.net Projektordner. Achtung CSoft.Core ist ein von mir erstelltes persönliches Framework.

Das ist mein Stack Trace:

[IsolatedStorageException: Kann nicht das Speicherverzeichnis erstellen. (Ausnahme von HRESULT: 0x80131468)]
System.IO.IsolatedStorage.IsolatedStorageFile.nGetRootDir (IsolatedStorageScope scope) +0
System.IO.IsolatedStorage.IsolatedStorageFile.InitGlobalsNonRoamingUser (IsolatedStorageScope scope) +97
System.IO .IsolatedStorage.IsolatedStorageFile.GetRootDir (IsolatedStorageScope scope) +137
System.IO.IsolatedStorage.IsolatedStorageFile.GetGlobalFileIOPerm (IsolatedStorageScope scope) +213
System.IO.IsolatedStorage.IsolatedStorageFile.Init (IsolatedStorageScope scope) +56
System.IO.IsolatedStorage.IsolatedStorageFile.GetStore (IsolatedStorageScope Umfang, Art domainEvidenceType, Typ assemblyEvidenceType) +59
CSoft.Core.IO.StorageHelper.Save (String Dateiname, String-Gehalt) in c: \ Projectos \ FrameworkCS \ CSoft.Core \ IO \ StorageHelper.cs: 18
CSoft.Web.UI.ViewStateHelper.SerializeViewState (HttpContext-Kontext, Objektstatus) in c: \ Projectos \ FrameworkCS \ CSoft.Web.Controls \ Web \ UI \ ViewStateHelper.cs: 65 CSoft.Web.UI.Page.SavePageStateToPersistenceMedium (Objektzustand) in c: \ Projekte \ 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

+1

Bitte posten Sie die komplette Ausnahme, einschließlich aller InnerException. Fangen Sie die Ausnahme ab und veröffentlichen Sie das Ergebnis von ex.ToString(). –

Antwort

3

Ich änderte IsolatedStorage Datei zu

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

Und diese Arbeit.

0

Wie sind Sie mit dieser auf dem Server? Wenn Sie es als Dienst auf dem Server ausführen, liegt möglicherweise ein Problem mit dem Benutzer vor, der zum Ausführen des Dienstes zugewiesen ist. Stellen Sie sicher, dass Sie mit demselben Benutzer testen, den Sie auf dem Produktionsserver verwenden.

0

Wie John Saunders in seinem Kommentar fragt, posten Sie bitte mehr der Stack-Trace, einschließlich, wenn möglich, die Zeilen, die die Expection werfen.

jedoch mit einigen psychic debugging skills, ich werde ein paar wilde ersticht hier nehmen, die helfen könnten:

  1. IsolatedStorageException kann sowohl GetStore und der IsolatedStorageFileStream Konstruktor geworfen werden
  2. „Es funktioniert gut in Windows XP "- wenn Sie die Site auf dem in Visual Studio integrierten Webserver ausführen, der unter Ihren (wahrscheinlich Administrator-) Anmeldeinformationen ausgeführt wird, aber sicher als Benutzer mit einem Profil und daher als Isolated Storage-Ordner.
  3. "Aber auf der Produktion wirft es eine Ausnahme" - wenn es entweder unter "Netzwerkdienst" oder einem anderen Konto, das kein Profil oder Interact mit Desktop-Typ-Rechte (nicht sicher von den Besonderheiten - es ist vor allem die Mangel an einem Profil, das ein Mörder ist).

Für welche Art von Konto läuft die Website in der Produktion? Ich nehme an, es ist kein Benutzer, der sich am Server anmelden und richtig mit dem Dateisystem interagieren kann.

7

Ich weiß, dass dieser Benutzer ihr Problem bereits gelöst hat, aber für andere auf der Suche nach einer Antwort. Dieser Beitrag ist nicht perfekt, aber er zeigt Ihnen, was Sie brauchen, um dieses Problem zu lösen.

Mit asp.net GetMachineStoreForAssembly scheint in den meisten Fällen zu arbeiten, und es ist wahrscheinlich der gewünschte Modus bei der Verwendung von isolierten Speicher von einer Web-App. Denn selbst wenn Sie GetUserStoreForAssembly verwenden, wird es von dem Benutzerkonto isoliert, das die asp.net-App ausführt, und es wird für jeden Website-Benutzer immer derselbe sein, es sei denn, Sie ordnen jede Anmeldung einem Windows-Benutzer zu (oh und wenn ja tu dies dann würde es funktionieren).

Das Problem ist dann versuchen Sie, GetUserStoreForAssembly zu verwenden, da es einen Benutzer mit Rechten auf isoliertem Speicher benötigt, der Standard-IIS-Benutzer für Anwendungen erhalten keine Rechte für das, denke ich.

Es gibt zwei Lösungen:

  1. Verwendung GetMachineStoreForAssembly

  2. Wenn Sie verwenden müssen GetUserStoreForAssembly die App gesetzt als Benutzer mit Rechten auszuführen. Dies wird nicht durch Ordnerberechtigungen gelöst. Es gibt mehrere Möglichkeiten, Sicherheitseinstellungen einzurichten: (IIS7) Sie können sie im App-Pool oder unter den Grundeinstellungen> Verbinden als oder unter Authentifizierung> Anonymes Authentifizierungsverfahren festlegen. Ich bin mir nicht sicher, welche Rechte der Benutzer braucht, aber dies bringt Sie in die richtige Richtung.

Hier einige Bonus-Code, als Sie Ihr Problem herauszufinden, kann helfen:

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 ist hier: C: \ Dokumente und Einstellungen \ Gabe \ Lokale Einstellungen \ Anwendungsdaten \ IsolatedStorage \

GetMachineStoreForAssembly ist hier: C: \ Dokumente und Einstellungen \ All Users \ Anwendungsdaten \ IsolatedStorage \

+0

Hinweis: Einige Benutzerprofile (z. B. NetworkService) befinden sich unter C: \ Windows \ ServiceProfiles – Earlz

5

Wenn es auf IIS ausgeführt wird und die Identität des Anwendungspools NetworkService ist, können Sie versuchen, die erweiterten Einstellungen des Anwendungspools aufzurufen und den Wert "Benutzerprofil laden" auf "True" zu setzen. Arbeitete für mich.

+0

Funktioniert auch für mich, vielen Dank. Eigentlich ist meine ApplicationPoolIdentity –

Verwandte Themen