| 

.NET C# Java Javascript Exception

4
Hallo,

ich würde gerne in C# eine AutoUpdate-Funktionalität realisieren. Also so wie beim Firefox... "Neue Updates gefunden... wollen Sie Update installieren usw."
Welche Möglichkeiten kennt Ihr dies zu tun und welche erachtet ihr als leicht erweiterbar?

Grüßle
News:
08.09.2009
Scout 1,4k 2 8
9 Antworten
5
Wenn ich einen neuen Update-mechanismus mir einfallen lassen müßte würde ich folgende Überlegungen angehen:

1. Wie informiere ich den Client darüber das neue Updates zur Verfügung stehen?
Hier würde ich eine Web-Services nehmen oder eine Web-Seite die Sturkturiert die Informationen ausgibt die ich Anfordern. Als Beispiel könnte man das als eine Seite wie "http://www.meinServer.de/MeineSoftware/CurrentVersion.ext" die lediglich die neuste Versionsnummer ausgibt realisieren.
Natürlich reicht das nicht aus, den der Client will ja nicht nur Wissen, ob er die neuste Version hat, sondern auch, wo er eventuelle Updates her bekommt und wie diese "heißen".
Also könnte man die CurrentVersion.ext so verändern das Sie als Antwort eine XML-Struktur gibt, die nicht nur die aktuellste höchste Versionsnummer enthällt, sondern auch eine Liste aller zur Verfügung stehenden Updates. Dazu müßte man jedoch zuerst noch dem Server die aktuelle Versionsnummer mitteilen: "http://www.meinServer.de/MeineSoftware/CurrentVersion.ext?ClientVersion=0.9.5". Aus Sicherheitsgründen sollte ich diesen Informationsabruf aber in irgendeiner Form signieren, um ManInTheMittel-Attacken zu verhindern. Dies lößt man in dem man statt HTTP HTTPS verwendet und somit eigene Zertifikate verwenden kann. Der Client kann prüfen, ob die Antwort wirklich von http://www.meinServer.de/ stammt.

2. Wie/Woher bekomme ich die Patches/Updates?
Durch die SSL-Sicherung der Verbindung (Authentifizierung und Authentizität) kann ich nun verschiedene Update-Möglichkeiten mir überlegen.
Am einfachsten wäre es natürlich wenn der Client die Patches direkt wie in der XML-Dateie benannt, von http://www.meinServer.de/Updates/Update-0.9.5-to.0.9.6.exe zieht. Dies ist aber bei großen Projekte, oder bei vielen Nutzern ohne Load-Balancing nicht zu empfehlen. Alternativ könnten in dem XML-File auch mehrere Downloadadressen für den Patch stehen (z.B.: von RapidShare, FileHost, etc.) oder die Patches können per Torrent gezogen werden (wird bei größeren Patches verwendet, z.B.: WorldOfWarcraft-Patches werden so verteilt). Da jedoch ein Dritter diese Patches auf beim FileHoster oder Minori verändern könnte, müßen natürlich die Patches selber auch mit den unter Punkt 1. beschriebenen Zertifikat signiert sein. Dadurch kannst man sicherstellen das die Patches wirklich nur vom Author das Programm stammen. Außerdem sollte man auch die Hashs der Dateien in der XML-Datei übertragen um diese ebenfalls nochmal zu prüfen. Alternativ kann man auch das Signieren der Patches selbst weg lassen und sich nur auf die Hashes verlassen.

3. Wie installiere ich die Patches?
Nun hier gibt es im wesentlichen nur 2 Möglichkeiten. Entweder der Patch installiert sich selbst, oder es gibt eine Updater-Komponente als eigenständige Exe im Programmverzeichnis die die Informationen aus dem Patch ließt und auswertet.

4. Eine Beispiel-XML
Quelle: httpS://http://www.meinServer.de/MeineSoftware/CurrentVersion.ext?ClientVersion=0.9.5

<?xml version="1.0" encoding="UTF-8"?>
<CurrentVersion>0.9.7</CurrentVersion>
<Updates>
<Update>
<ID>1</ID>
<Name>Update-0.9.5-to.0.9.6.exe</Name>
<Quellen>
<Quelle>http://rapidShare.de/abc445/Update-0.9.5-to.0.9.6.exe</Quelle>
<Quelle>http://FooShare.de/13861946194/Update-0.9.5-to.0.9.6.exe</Quelle>
<Quelle>http://BarShare.de/afgkagf29365/Update-0.9.5-to.0.9.6.exe</Quelle>
</Quellen>
<hash_MD5>a3cca2b2aa1e3b5b3b5aad99a8529074</hash_MD5>
<hash_SHA1>7e716d0e702df0505fc72e2b89467910</hash_SHA1>
</Update>
<Update>
<ID>2</ID>
<Name>Update-0.9.6-to.0.9.7.exe</Name>
<Quellen>
<Quelle>http://FooShare.de/13861946194/Update-0.9.6-to.0.9.7.exe</Quelle>
<Quelle>http://BarShare.de/afgkagf29365/Update-0.9.6-to.0.9.7.exe</Quelle>
</Quellen>
<hash_MD5>73cca2b2aa1e3b5b3b5aad99a8529074</hash_MD5>
<hash_SHA1>be716d0e702df0505fc72e2b89467910</hash_SHA1>
</Update>
</Updates>


Dadurch erreichst du ein LoadBalancing ohne viel Aufwand. Natürich kannst du diesen Weg nicht im gewerblichen Rahmen verwenden, jedoch wer Geld mit der Software erziehlt die er Updaten will, sollte auch Geld für ein eigenen LoadBalancing übrig haben ;).

5. Wie Erzeuge ich Patches?
Auch hier gibt es verschiedene Möglichkeiten. Zum einen kann man, wie oben schon erwähnt, ClickOnce verwenden, zum anderen gibt es die Möglichkeit das dir InstallShield und andere Installer Patches erzeugen. Auch spezielle Software z.B. Bigfix Enterprise Suite die solche Aufgaben professionell lösen.

6. Erweiterbarkeit dieses Ansatzes
Da das Hauptübertragungsmedium in diesem Ansatz XML ist, und XML-Serialisizer neu hinzugekommene und fehlende Bestandteile des XML's ignorieren, läßt sich dieser Ansatz leicht erweitern.

7. Vor- und Nachteile diese Ansatz
Als Vorteil sticht natürlich herraus das es zum einen ein sehr sicherer Weg ist, und zum anderen leicht erweiterbar ist. Hinzu kommt das bereits intigrierte LoadBalanching das sich sowohl auf ein interens, als auch ein externes Abbilden läßt.

Als Nachteil kann man vorbringen, das der Implementierungsaufwand höher ist, als wenn man einfach immer die neuste Version eines Programms von der WebSeite herrunterläd (diese Ansatz verfolgt zum Beispiel der VLC-MediaPlayer der bei jedem Versionswechsel die neuste Installationsdatei vom Server downloadet und anschließend installiert.)
08.09.2009
Floyd 14,6k 3 9
Floyd 14,6k 3 9
4
Eine Möglichkeit ist die Verwendung eines WebService. Der kann schön zentral verwaltet und evtl. Änderungen können mit den Updates ausgeliefert werden.
Für kleiner Projekte ist auch ClickOnce eine gute Wahl.
08.09.2009
klaus_b 1,6k 3 7
2
Was du dabei aber beachten solltest, ist der Zugriff auf den Server, von dem das Update geladen wird! Du müsstest eine Art Warteschlange programmieren, damit der Server nicht zur selben Zeit an jeden Client eine Meldung schickt "Hallo neues Update verfügbar.". Das würde den server wahrscheinlich sehr überlasten. Also soll er erst eine Meldung an den nächsten (!!verfügbaren!!) Client senden, wenn ein Platz in der Warteschlange frei ist.
Wenn du dich ein wenig mehr mit dem Thema befassen möchtest, erkundige dich mal nach Updatesystemen auf Serverbasis.

Schönen Tag noch,
DarkDust.
08.09.2009
darkdust 451 2 6
Da er den Update-Mechanismus beim Programmstart laden möchte, ist das denke ich mal für kleinere Programme nicht ganz so relevant.

Schließlich startet nicht jeder Nutzer sein Programm zur gleichen Zeit. Und es werden wohl auch kaum 1000 User sein ;)
Dustin Klein 08.09.2009
Es ist allerdings gut zu wissen, dass dort der Knackpunkt bei Programmen liegt, die eine größere Verbreitung haben.
Scout 08.09.2009
Dustin Klein, wenn man sowas macht, dann sollte man an die Nachhaltigkeit von den Funktionen bzw. Klassen denken. Und dann soll er es lieber gleich vernünftig machen...
darkdust 08.09.2009
Generell gebe ich dir Recht, weiß ich aus eigener Erfahrung, dass Leute, die neu in diesem Thema sind, immer gerne ersteinmal was simples ausprobieren möchten. Aber dennoch hast du zu 100 % Recht!
Dustin Klein 08.09.2009
1
Ich glaube was du suchst ist eine Art ClickOnce Deployment. In der Microsoft MSDN Hilfe findest du eine Beschreibung dieser Methodik. Das Ganze hier einmal zu erklären wäre etwas zu viel des Guten, aber es gibt natürlich auch noch andere Möglichkeiten als ClickOnce.

Du kannst zum Beispiel Parameter an eine URL übergeben (via WebService), die auf deine (also die Hersteller) Seite verlinkt. Dort lässt du von einem PHP oder Perl Script prüfen, ob die Versionsnummer, die du via Parameter übergeben hast, mit der aktuellsten in einer DB oder einer TXT File übereinstimmt.

Danach könntest du an das Programm eine Meldung übergeben, ob es eine neuere Version gibt und wenn ja, wo diese liegt. Das Programm lädt dann eine Art Install-Tool herunter und startet diese neue .exe. Diese beendet dein Hauptprogramm und kopiert alle nötigen Dateien in die entsprechenden Verzeichnisse und startet zum Schluss wieder dein Hauptprogramm.

Ich denke aber dass das ClickOnce Deployment schöner ist ;)

http://msdn.microsoft.com/en-us/library/t71a733d%28VS.80%29.aspx
08.09.2009
Dustin Klein 2,9k 2 9
1
ich kann auch noch den AppDater, aus einem der Entwickler im mycsharp Forum empfehlen:
AppDater
scheint einen sehr guten Eindruck zu machen...
08.09.2009
1
Wie auf neue Versionen geprüft wurde ja schon ausführlich erklärt.
Fürs aktualisieren der Anwendung kann Shadow Copying verwendet werden. D.h. die neuen Programmdateien überschreiben während des Betriebs die alten und wenn die Anwendung das nächste mal gestartet wird werden die neuen Programmdateien verwendet.
So wäre es möglich das automatische Update im Hintergrund ohne Unterbrechung des Programmsablaufs durchzuführen.

Shadow Copying wird übrigens von ASP.net auch verwendet. Dort kann im "IIS-Verzeichnis" eine Seite auch während des Betriebs erneuert werden.
08.09.2009
gfoidl 9,4k 3 5
0
Eine Möglichkeit besteht darin, in deinem Programm einfach eine Versionsnummer bzw. ein MD5-Hash übers Web zu prüfen und im Falle einer Differenz ein zweites Update-Programm im Hintergrund starten (Unsichtbar oder sichtbar), das die neuen Daten herunterläd und letztlich die alten Daten überschreibt. Davor muss natürlich das Hauptprogramm geschlossen werden.
08.09.2009
Blauesocke 637 2 8
0
Ich greife mal Floyds Antwort auf und beziehe mich auf die konkrete Zielsprache C# wie in der Frage).
1. Wie informiere ich den Client darüber das neue Updates zur Verfügung stehen?

Der Client kann per Webservice vom Server alle benötigten Informationen ziehen. Für die Sicherheit kann zB die Seriennummer mit übertragen werden. Um HTTPS kommt man aber nicht herum.

2. Wie/Woher bekomme ich die Patches/Updates?

Der selbe Webservice (mit den Enhancement oder als WCF-Webserivce) kann die Daten zum Client streamen. Dazu werden zB die Bytes blockweise in den Response geschrieben und auf Clientseite entsprechend blockweise gelesen.

3. Wie installiere ich die Patches?

Wie ich bereits oben erwähnt habe am einfachsSten per Shadow copying.

4. Eine Beispiel-XML

Wird nicht benötigt da der Webservice die Daten liefert die gebraucht werden.
08.09.2009
gfoidl 9,4k 3 5
Das Beispiel-XML war dazu gedacht meine Ausführungen zu verdeutlichen :D
Wenn man .net und Webservices verwendet, kann man selbstverständlich die Informationen vom WebServer und dem Framework generieren lassen wobei Sie dann als XML oder SOAP zur Verfügung stehen.
Eine Implementierung in ASP, PHP, CGI oder einer anderen Sprache hat diesen Vorteil nicht.
Von daher war das XML als Dokumentation gedacht :D
Floyd 08.09.2009
0
Ich habe auch mal einen geschrieben. Kern des Ganzen war ein WindowsService, welcher zyklisch int einem Netzwerkverzeichnis bzw. einer Url nachgesehen hat, ob es neue Msi-Files gibt. Der Service hat dann die aktuell installierte Version mit der Version der Msi-Dateien verglichen. Sollte eine neue verfügbar sein, wird diese autom. installiert.
04.03.2011
phlow666 922 1 9

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH