 Die meisten Anwendungen müssen benutzerabhängige Daten
irgendwo speichern. Doch wo ist der beste Platz? Sollten
Konfigurationsdaten in einer Datenbank abgelegt werden? Oder in der
Registry? Und das für jeden Benutzer? Es gibt eine interessante
Alternative: Isolierte Speicherung, auf Englisch Isolated
Storage.Das ist ein Mechanismus, der pro Anwender und pro
Anwendung einen eigenen, von den anderen isolierten Speicherort auf
der Festplatte zur Verfügung stellt.
Für diesen Speicherort gelten besondere Regeln. So kann
Isolated Storage z.B. auch von Komponenten aus dem Internet
verwendet werden, die ansonsten keine Rechte haben auf das
Dateisystem zuzugreifen.
Auf dieser Seite
Die Isolierten Speicher von MyLand
Die Bürger von Myland sind durch ihre bezaubernden Modekreationen
berühmt und reich geworden. Viele Familien haben dadurch große
Schätze angehäuft, die sie in ihren Isolated Storage
genannten Schatzkammern verstecken, so dass sie nicht von anderen
gefunden und verwendet werden können.
Dabei gibt es nicht nur eine Schatzkammer pro Familie. Vielmehr
haben die Eltern ihre eigene, genauso wie die Kinder, die auch schon
versuchen wirtschaftlich erfolgreich zu sein. Sind die Kinder zu
Besuch bei den Großeltern, dann legen sie auch dort eine
Schatzkammer an.
So hat jeder MyLander nicht nur eine Schatzkammer für sich,
sondern an jedem Ort, an dem er aktiv ist seine eigene.
So ähnlich verhält es sich mit dem Isolierten Speicher im .NET
Framework. Jede Assembly bekommt seinen eigenen Speicherbereich und
wenn eine Assembly-DLL in verschiedenen Prozessen läuft, kann sie
auch verschiedene Speicherbereiche haben.
Einführung
Wo würden Sie Konfigurationsdaten für den angemeldeten Benutzer
speichern? Eine Variante ist die Registry, wo unter dem Schlüssel
HKEY_CURRENT_USER Informationen gespeichert werden können.
Was aber wenn Sie eine komplette XML-Konfigurationsdatei oder ein
serialisiertes Objekt speichern möchten? Auch diese Informationen
ließen sich in der Registry ablegen. Einfacher wäre es aber, die
Daten im Dateisystem abzulegen.
Dadurch wird auch die Größe der Registry geschont, die sonst bei
sehr vielen Anwendern stark wachsen würde. Eine große Registry
verlangsamt das Gesamtsystem. Ein weiterer Aspekt ist, das auf die
Registryschlüssel unter HKEY_CURRENT_USER jede Anwendung
zugreifen kann. Die Anwendungsspeicher wären dann nicht voneinander
isoliert.
Was machen Sie mit einer DLL, die im Global Assembly Cache
installiert ist und die auch Daten auf die Festplatte schreiben
möchte? Diese DLL kann von mehreren Anwendungen verwendet werden,
die wiederum auf einem Terminalserver von mehreren Benutzern
parallel gestartet werden. Jede Instanz der DLL möchte jedoch ihren
eigenen kleinen Datenspeicher haben - wie die Bewohner von MyLand,
die ihre Schätze auch nicht mit Familienmitgliedern teilen
wollen.
Die strikte Trennung
Isolated Storage verwendet verschiedene Merkmale um diese
Speicherbereiche auseinander zu halten. Jeder Benutzer hat zunächst
einmal seinen eigenen Bereich auf der Festplatte, der normalerweise
unter C:\Dokumente und Einstellungen\$USERNAME$\Lokale
Einstellungen\Anwendungsdaten\IsolatedStorage zu finden ist.
Dort werden automatisch Verzeichnisse erstellt, die zum Beispiel
so heißen: 0nxp1ndx.4bs. Darunter werden wiederum die Dateien
und Verzeichnisse und dazugehörige Metadaten innerhalb (!) eines
Isolated Storage angelegt.
Im Prinzip können diese Daten also auch über das normale
Dateisystem gelesen werden, aber der Weg dahin ist aufwändig und
Komponenten, die von nicht vertrauenswürdigen Zonen im Sinne des
Security-Systems der Common Language Runtime stammen, dürfen auf das
normale Dateisystem gar nicht zugreifen - wohl aber auf ihren
eigenen Isolated Storage.
Arten der Isolierung
Für die Isolierung der Speicherorte werden drei verschiedene
Identitäten unterschieden:
| • |
User |
| • |
Identität der Assembly |
| • |
Domain |
Die Stores unterschiedlicher Anwender sind immer voneinander
getrennt, das wird schon durch den Speicherort unter
c:\...\Eigene
Dateien\...sichergestellt.
Die Identität einer Assembly wird über ihren Strong Name
festgestellt, existiert dieser nicht, dann werden Url oder Pfad
ihrer Herkunft verwendet.
Wenn nun aber die gleiche DLL von zwei verschiedenen
Host-Assemblies verwendet wird, dann muss ein weiteres
Unterscheidungsmerkmal her: die Application-Domain, die die DLL
lädt. Und das ist dann wiederum ein Strong Name oder eine URL
bzw. ein Pfad des Host-Assemblies.So kann also jedes MyLänder-Kind
eine eigene Schatzkammer in jedem Haus nur für sich bekommen.
Roaming Profiles
Isolierter Speicher ist normalerweise auf einen Computer
beschränkt. Meldet sich ein Anwender auf einem anderen Computer an,
dann müsste er alle Daten erneut speichern.
Wenn für einen Windows Anwender Roaming Profiles unterstützt
werden, dann können aber auch die Daten des Isolated Storage dem
Anwender auf jedem Computer im Netzwerk zur Verfügung stehen, eine
mobile Schatzkammer so zu sagen.
Allerdings sollte darauf geachtet werden, dass die Daten nicht zu
groß werden, sonst dauert die Anmeldung des Benutzers zu lange. Das
Abspeichern der privaten Fotogalerie ist also keine so gute Idee,
zumal für den Isolated Storage eine Größenbeschränkung existiert um
Denial of Service Attacken zu erschweren. Diese Grenze kann
vom Administrator festgelegt werden. In einer mobilen Schatzkammer
würde man ja auch nicht seine Gemäldesammlung mitnehmen.
Auf in die neue Speicherwelt
Eine Datei schreiben
Nun aber genug der grauen Theorie. Lassen Sie uns eine Datei in
den Isolierten Speicher schreiben. Die Klasse
IsolatedStorageFile stellt uns einen solchen Isolierten
Speicherbereich zur Verfügung, repräsentiert also weniger eine
Datei, als einen Speicherort, innerhalb (!) dessen mehrere Dateien
und Ordner erstellt werden können. Der Klassenname mit „File“ am
Ende ist also etwas missverständlich.
Der eigentlichen Zugriff zum lesen und schreiben von Dateien
erfolgt dann über das IsolatedStorageFileStream-Objekt.
Dieses kann mit den üblichen StreamReader und
StreamWriter-Objekten aus dem System.IO-Namensraum
verwendet werden.
Über die statische (Shared) Methode
GetUserStoreForDomain erhalten Sie eine Referenz auf ein
IsolatedStorageFile-Objekt. Über dieses Objekt können Sie ihr
kleines Schatzkästlein verwalten und strukturieren (z.B. durch
Anlage von Verzeichnissen), siehe Tabelle 1.
|
CreateDirectory, DeleteDirectory |
|
GetFileNames, GetDirectoryNames |
|
DeleteFile |
Mit dem IsolatedStorageFile-Objektes können Sie einen
IsolatedStorageFileStream erstellen und diesen können Sie
dann wie andere Stream-Objekte auch verwenden und z.B. mit
Hilfe eines StreamWriter beschreiben: Imports System.IO
Imports System.IO.IsolatedStorage
Imports System.Xml
Public Sub WriteIsoStorageFile
Dim IsoStore As IsolatedStorageFile =
IsolatedStorageFile.GetUserStoreForDomain()
Dim isoStream As New IsolatedStorageFileStream("schatzkammer.xml", _
FileMode.Create, IsoStore)
Dim xSW As XmlTextWriter = New XmlTextWriter(isoStream, _
System.Text.Encoding.UTF8)
xSW.WriteStartDocument()
xSW.WriteStartElement("Schätze")
For Each i As Object In New String() {"Siegelring", "Goldkette", "Amulett"}
xSW.WriteElementString("Schatz", i.ToString)
Next
xSW.WriteEndElement()
xSW.Flush()
xSW.Close()
isoStream.Close()
IsoStore.Close()
End Sub
Strong Names
Damit Assembliy-Identitäten nicht von ihrem Speicherort (URL)
abhängig sind, sollten diese mit einem Strong Name signiert
werden. So kann die Assembly auf ihre Schatzkammer zugreifen, auch
wenn es auf der Festplatte herumreist.
Das geschieht in Visual Studio 2005 ganz einfach über den My
Project Designer. Sie erreichen ihn über den Solution Explorer,
dort finden Sie direkt unterhalb des Projektes den Knoten My
Project und über ihn gelangen Sie zum Designer. Der Designer
verfügt über eine Karteikarte Signing und dort können Sie ein
Strong Name Key File erzeugen und dem Assembly zuweisen.
Eine Datei lesen
Das Lesen ist ähnlich einfach wie das Schreiben. Sie benötigen
wieder IsolatedStorageFile- und
IsolatedStorageFileStream-Objekte und können dann mit einem
beliebigen StreamReader-Objekt die Datei auslesen.
Über die GetFileNames-Methode können Sie alle Dateinamen des
Speicherortes ermitteln: Dim myIsoStore As IsolatedStorageFile
myIsoStore = IsolatedStorageFile.GetUserStoreForDomain()
Dim StoreFileNames As String()
StoreFileNames = myIsoStore.GetFileNames("schatzkammer.xml")
If StoreFileNames.Length = 1 Then
Dim stmReader As New StreamReader( _
New IsolatedStorageFileStream(StoreFileNames(0), _
FileMode.Open, myIsoStore))
Dim xmlReader As New XmlTextReader(stmReader)
…
xmlReader.Close()
stmReader.Close()
Else
MsgBox("This File Name was not found in the Store!", MsgBoxStyle.Exclamation)
End If
myIsoStore.Close()
Zusammenfassung
So haben die Myländer also ein ausgeklügeltes System von
Schatzkammern erdacht, das es Schatzjägern schwer machen dürfte. So
sind zwar die Schätze irgendwo auf der Festplatte gespeichert, dort
aber nur schwer zu finden. Nur die Berechtigten kommen kinderleicht
an Ihre Daten. Besonders schön gelungen scheint mir die Trennung der
Speicherbereiche voneinander. So kann es nicht zum Streit über die
Datenschätze kommen.
Der Isolated Storage Mechanismus wird bis jetzt nur selten
verwendet, weil er den meisten Entwicklern noch unbekannt ist. Er
bietet eine einfache Möglichkeit Dateien nach Benutzern und
Anwendungen getrennt auf die Festplatte zu schreiben. Mit der
zunehmenden Verbreitung von Terminalservern, aber auch
Webanwendungen wird diese Aufgabe immer wichtiger.
Einen zweiten Aspekt stellt die Sicherheit dar. Komponenten, die
aus dem Internet oder Intranet herunter geladen werden gelten als
nicht voll vertrauenswürdig und haben keine Möglichkeit direkt auf
die Festplatte zu schreiben. Isolated Storage bietet einen fest
vorgegebenen und beschränkten Platz, wo diese Komponenten Dateien
ablegen dürfen.
Ressourcen
Chris Tavares, Understanding Isolated Storage, http://www.dotnetdevs.com/articles/IsolatedStorage.aspx
MSDN, Isolated Storage, http://msdn.microsoft.com/library/en-us/cpguide/html/cpconIsolatedStorage.asp
MSDN, Isolated Storage Tool, http://msdn.microsoft.com/library/en-us/cptools/html/cpgrfisolatedstorageutilitystoreadmexe.asp
Über den Autor
Marcel Gnoth liest leidenschaftlich gern Reisegeschichten und
schreibt auch über seine eigenen Reisen. Wenn er in Deutschland ist,
dann verdient er sich sein Geld für die Reisen mit der .net
Entwicklung bei der Berliner NTeam GmbH. Weitere Informationen
finden Sie unter http://www.gnoth.net/ .
|