[C#] Server Abfrage zwecks Programm-Updates

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
viennadevil
Beiträge: 5
Registriert: 31.08.2010, 22:47

[C#] Server Abfrage zwecks Programm-Updates

Beitrag von viennadevil »

Hallo!

Also erstmal vorweg, sollte das das Falsche Unterforum sein, bitte verschieben.
Ich bin gerade dabei für mein kommendes Projekt ein bisschen vorarbeit zu leisten. Dabei gehts in erster Linie nicht um den Code ansich, sondern um die optimierung des Vorgangs, der dann umgesetzt werden soll.

Zuerst mal kurz zum Projekt:
Für meinen Sportverein entwickle ich gerade eine (noch) kleine Trainings-Software, die - durch User eingaben (noch keine bessere Möglichkeit) - den aktuellen Trainingsfortschritt abseits der organisierten Trainings überwachen soll. Also eher in Hinsicht auf Konditions- und Kraft Training.
Dafür möchte ich jetzt die Kommunikation mit einem Server (Linux / Samba) ermöglichen. Vorläufig sollen da mal nur die Trainingspläne für die Folgewochen, -monate automatisch "aktualisiert" werden können. Das heißt also, das Programm soll selbstständig die Verbindung mit dem Server herstellen, kontrollieren ob ein "neueres" file verfügbar ist als derzeti verwendet wird, und dieses dann gegebenenfalls runterladen. (Inkludiert wird das ganze dann noch extra in das Programm, soll jetzt also nicht das entscheidende Problem sein.

Jetzt bin ich also auf der Suche nach geeigneten Lösungs-Ansätzen für die Problemstellung.
Es soll also beim Start des Programms selbstständig (oder notfalls auch durch gewolte aktualisierung des Benutzers) über den Server abgeglichen werden, ob ein aktuelles File (zwecks wiederverwertbarkeit am besten unabhängig vom Dateiformat) zur Verfügung steht. Dieses soll dann heruntergeladen und am dem Programm entsprechenden Ort abgelegt werden, damit es dann auch inkludiert werden kann. (Soll ja auch kein Chaos entstehen, weil diverse "aktualisierte" Files wo ganz wo anders abgespeichert werden und dann vielleicht von einem ahnungslosen User gelöscht oder umkopiert werden)
Wie kann so eine Server-Abfrage jetzt am sinnvollsten funktionieren?
Werden Dateinamen verglichen? Woher weiß das Programm dann welche Datei aktueller ist? (Bsp: 06-10 und 07-10 vergleichen ist ja noch relativ logisch, aber wenn dann 06-10 und 06-11 abgeglichen werden soll... naja könnte doch Probleme machen oder?)
Kann man theoretisch "Versions-Nummern" der Files definieren, die dann abgefragt werden?
Oder sollte über ein anderes (unabhängiges) file, welches bei jedem Programmstart mit dem Server ausgetauscht (also neu runtergeladen) wird, abgeglichen werden, welches File das gerade aktuellste ist (zb durch einen einzellnen Eintrag in so einem "dritten" file)

Den Files am Server immer den gleichen Namen zu geben und diese so einfach übershreiben zu lassen geht nicht, weil immer ein update aufs Folgemonat kommen soll, obwohl das aktuelle Monat noch läuft. D.h es müssen also immer (mindestens) 2 files im Programm aktiv sein - was sich aber durch diverse Turnier-Termine, die übers Jahr konstant bleiben und also nicht immer "upgedatet" werden sollen, sowieso immer mehr "aktive" Files werden.

Wie würdet ihr also von der Theorie her so ein Update-Projekt anlegen?

lg
ViennaDevil
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4263
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: [C#] Server Abfrage zwecks Programm-Updates

Beitrag von Chromanoid »

Es kommt ein bisschen darauf an, was du auf dem Server alls machen kannst/machen möchtest. Eine einfache Variante wäre vielleicht zur Abfrage einen kleinen PHP Script, der auf dem Server liegt zu benutzen. Wenn du nun auf updates prüfen möchtest, übergibst du das Datum (im unix timestamp format) des letzten updates und den Namen der Datei, die du haben möchtest. Der Server schaut, ob die Datei später geändert wurde (setzt voraus, dass das Änderungsdatum der Datei stimmt und gepflegt wird). Wurde sie später verändert, gibt der Server die Datei zurück, ansonsten kommt ein Errorcode oder so zurück.

So ungefähr:

Code: Alles auswählen

<?php
//Abfrage erfolgt so: _http://server.tld/get.php?filename=plan.txt&timestamp=0
//timestamp nach erstem update über zurückgegebenen custom header lokal speichern und beim nächsten update übergeben
$filename=$_GET['filename'];
$timestamp=$_GET['timestamp'];

if(!file_exists($filename)){
  header("HTTP/1.0 404 Not Found");
  return;
}

$dateOfFileOnServer=filemtime($filename);
if($dateOfFileOnServer>$timestamp){
  header("Content-Type: application/octet-stream"); 
  header("Content-Disposition: attachment; filename=\"".$filename."\";");
  header("X-Update-Time: ".time());
  readfile($filename);
}
else
{
  header("HTTP/1.0 304 Not Modified");
}
?>
Der Custom Header ist ein bisschen dreckig, aber so kannst du das Datum des Updates direkt an den Client übergeben und dort dann speichern. Eine Liste mit den HTTP Headern bei einem HTTP Request bekommst du so in C#: http://www.jonasjohn.de/snippets/csharp ... header.htm

Wenn das ganze etwas komplexer wird solltest du über ein anderes Updatesystem nachdenken - darüber können wir gerne diskutieren :) ich muss jetzt erst mal ins Bettchen ^^.
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4263
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: [C#] Server Abfrage zwecks Programm-Updates

Beitrag von Chromanoid »

War gestern etwas müde :) und hab deswegen etwas um die Ecke gedacht...
An sich sollte das ganze auch mit dem Last Modified Header funktionieren (je nachdem ob dein Webserver das mitgitbt - sollte aber so sein). Dann kannst du einfach von der HTTP Response das Datum der letzten Änderung der Datei ermitteln ohne den PHP Script auf dem Server. Siehe http://msdn.microsoft.com/en-us/library ... S.71).aspx
Das Datum der Dateierstellung kannst du dann (wenn du dich darauf verlassen kannst/möchtest) sogar im Client Dateisystem setzen indem du die FileInfo-Klasse benutzt (http://msdn.microsoft.com/de-de/library ... S.80).aspx). Mit IfModifiedSince vom HTTPWebRequest oder sowas müsstest du auch dafür sorgen können, dass du nur eine Datei zurück bekommst, wenn die Datei neuer ist...
viennadevil
Beiträge: 5
Registriert: 31.08.2010, 22:47

Re: [C#] Server Abfrage zwecks Programm-Updates

Beitrag von viennadevil »

vielen dank für deine antwort(en)!
werde das dann so bald wie möglich ausprobieren, leider ist über nacht aber leider mein server leicht in die knie gegangen, aber sobald der wieder lauft werd ich mich dran setzen.

mit php kenn ich mich leider zu wenig aus um das wirklich sicher einsetzen zu können, werd daher eher lieber die 2. methode versuchen umzusetzen

dann darf ich vielleicht gleich noch eine zweite frage anhängen:
Also das Programm soll in weiterer Folge die Datenübertragung zum Server in beide Richtungen möglich machen. Also sollen diverse Datein, die vom Programm erstellt werden, auch wieder in die andere Richtung auf den Server hinauf geladen werden können, und dann wieder von einer anderen - nennen wirs mal - "Trainersoftware" runtergeladen und analysiert werden können.
Gut, sollte soweit ja alles mehr oder weniger machbar sein (wenn ich mich da mal intensiver in die Matiere eingearbeitet hab).

Jetzt bin ich aber auf der Suche nach einem geeigneten Dateiformat für diese auszutauschenden Datein.
- Es soll möglichst klein sein, um den Server-Traffic auch bei vielen Usern gering zu halten.
- Es soll flexibel sein, also einfach durch die jeweiligen Programme lesbar und veränderbar sein.
- Es soll vor allem nicht zu einfach durch den User veränderbar sein (nachträglichen - vielleicht unabsichtliches - Manipulieren der Daten verhindern) eventuell irgendwie verschlüsselt?

Was für ein Dateiformat würdet ihr dafür nehmen, um das umzusetzen?


PS: Denkt ihr es hat Sinn, für das Projekt im "Zusammenarbeiten" Forum nach Verstärkung zu suchen? Damit das ganze schneller fertig wird? Oder findet sich dafür sowieso keiner der mithilft? ;)

lg
ViennaDevil
Benutzeravatar
Chromanoid
Moderator
Beiträge: 4263
Registriert: 16.10.2002, 19:39
Echter Name: Christian Kulenkampff
Wohnort: Lüneburg

Re: [C#] Server Abfrage zwecks Programm-Updates

Beitrag von Chromanoid »

viennadevil hat geschrieben:PS: Denkt ihr es hat Sinn, für das Projekt im "Zusammenarbeiten" Forum nach Verstärkung zu suchen? Damit das ganze schneller fertig wird? Oder findet sich dafür sowieso keiner der mithilft?
Du kannst es ja mal versuchen. Aber ich glaube du hättest wahrscheinlich mehr Erfolg, wenn du in einem Forum für die Anwendungsdomäne (Training von was eigentlich?) mal nach Programmierern fragst.

Also du solltest dir auch noch mal genau Gedanken machen, ob du wirklich nur Dateien hin und herschicken willst. Es wäre zum Beispiel möglich stattdessen über einen Webservice einen Zugang zu einer Datenbank bereit zu stellen. Dort kannst du dann ein Datenmodell modellieren, das vielleicht etwas besser passt als das sehr einfache Vertrauen auf Dateien... Ansonsten kannst du mit LINQ ja auch sehr gut direkt eine Datenbank ansprechen.

Wenn du aber aus irgendeinem Grund lieber auf Dateien setzen willst, könntest du die netten Serialisierungs-Features von C#/.Net benutzen. Dort kann man ja mithilfe von Annotationen genau bestimmen was passieren soll. Um versehentliche Änderungen der Daten zu erkennen, kannst du einen Hash aus den zu speichernden Daten generieren und mit in die Datei speichern. Beim Einlesen generierst du dann wieder einen Hash und wenn beide Hashs nicht übereinstimmen, wurde die Datei verändert. Ich würde zu XML Serialisierung raten.

Möchtest du lieber ein portables wartbares binäres Datenformat benutzen, kannst du auch mal Serialisierungsframeworks wie Google protobuf anschauen. Für .Net gibt es wie für viele andere Systeme auch eine Implementierung: http://code.google.com/p/protobuf-net/

Wenn du viele Dinge, die ich hier erwähne, nicht verstehst, solltest das meiste sehr leicht googlen können - sonst auch gerne nachfragen. Wenn du mit WPF arbeitest, könnte zum Beispiel dieses Tutorial für dich interessant sein: http://www.codeproject.com/KB/WPF/wpfviews.aspx

PS: habe hier viel rumeditiert also nicht wundern :)

PPS: Für das Hochladen der Daten, solltest du dir erst mal überlegen wie sich die Benutzer anmelden können usw. Wenn du es ganz einfach haben willst, könntest du auch über einen Datenaustausch über FTP nachdenken.
Antworten