Luze Geschrieben 31. August 2010 Geschrieben 31. August 2010 Hallo alle miteinander, ich habe mal wieder ein problem. Und zwar tut ein von mir programmierter Dienst nicht 100% das, was er soll. Ein kleiner Bestandteil ist es, dass er ein Arbeitsprotokoll in einer Textdatei mitschreibt und dieses in regelmäßigen Abständen per Mail an mich schickt. Nun ist es aber das problem, dass der Dienst keinerlei Anstalten macht auch nur ansatzweise etwas zu schreiben. Kann es sein, dass man bei Diensten bei Dateizugriffen Besonderheiten beachten muss? Lg Zitieren
Klotzkopp Geschrieben 31. August 2010 Geschrieben 31. August 2010 Wo liegt denn diese Textdatei? Hat der Account, unter dem der Dienst läuft, dort Schreibrechte? Zitieren
Luze Geschrieben 31. August 2010 Autor Geschrieben 31. August 2010 also die Textdatei liegt in einem Ordner auf Laufwerk C, der Benutzer, unter dem der Dienst läuft, ist das Lokale System Zitieren
Gateway_man Geschrieben 31. August 2010 Geschrieben 31. August 2010 Startet der Dienst auch sauber? Der Dienst darf für die Abarbeitung der Startrutine nicht länger 30 Sekunden benötigen sonst gilt der Dienststart als Fehlgeschlagen und dieser wird beendet. Über Windows Dienst-Anwendungen Wenn OnStart länger als 30 Sekunden braucht, bricht der Service Control Manager (SCM) den Start ab und schreibt eine Fehlermeldung in das Ereignisprotokoll. Alles, was länger dauert, muss in einem eigenen Thread laufen, der von OnStart gestartet wird. Für sich wiederholende Operationen können Sie das Timer-Steuerelement verwenden. Lg Gateway Zitieren
Luze Geschrieben 31. August 2010 Autor Geschrieben 31. August 2010 ja er wird ganz sauber gestartet, das wird auch so im Windows Eventlog festgehalten Zitieren
NerdonRails Geschrieben 31. August 2010 Geschrieben 31. August 2010 Bist du sicher, das du die Methode zum Schreiben auch aufrufst ? Zitieren
Thanks-and-Goodbye Geschrieben 31. August 2010 Geschrieben 31. August 2010 Nur dass ein Dienst im lokalen Systemkontext läuft heisst noch lange nicht, dass er auf die Festplatte schreiben darf. Erteile doch spasseshalber mal dem Systemaccount explizit Schreibrechte auf den Ordner. Zitieren
Gateway_man Geschrieben 31. August 2010 Geschrieben 31. August 2010 (bearbeitet) hast du mit Exception Handling gearbeitet? Wenn ja, nimm die Try-Catch Handler mal raus (oder prepariere den catch block dementsprechend so, das er eine MessageBox mit dem Fehlertext anzeigt), deinstalliere den Dienst und installiere in mal neu. Wenn der Dienst wirklich kein Zugriff auf den Pfad hat, wirft er definitiv einen Fehler. Diesen kannst du dann diagnostizieren, beziehungsweise hier reinstellen. lg Gateway PS: Es wäre natürlich auch hilfreich, wenn du deine OnStart Prozedure mal posten würdest.... Bearbeitet 31. August 2010 von Gateway_man Zitieren
Klotzkopp Geschrieben 31. August 2010 Geschrieben 31. August 2010 Wenn ja, nimm die Try-Catch Handler mal raus (oder prepariere den catch block dementsprechend so, das er eine MessageBox mit dem Fehlertext anzeigt)Das bewirkt bestenfalls, dass der Dienst hängt. Dienste können und sollen nicht direkt mit dem Benutzer interagieren, die Messagebox würde niemand sehen. Luze, häng dich mit dem Debugger dran: How to: Debug Windows Service Applications Zitieren
Gateway_man Geschrieben 1. September 2010 Geschrieben 1. September 2010 Bist du dir da sicher? Ich bin mir ziemlich sicher das ich bereits MessageBoxen bei Dienstanwendungen erfolgreich integriert hatte. Naja er muss es ja auch nicht zwingen in ne messagebox für die Ausgabe nutzen. Dann soll er sich eben alles in eine logfile schreiben lassen, oder soll direkt einen Eintrag mit der Fehlermeldung per EventLog in die Ereignissanzeige reinschreiben. lg Gateway Zitieren
Klotzkopp Geschrieben 1. September 2010 Geschrieben 1. September 2010 Ich bin mir ziemlich sicher das ich bereits MessageBoxen bei Dienstanwendungen erfolgreich integriert hatte.Dienste haben eine eigene Window Station und damit einen eigenen Desktop. Sie müssen ja auch funktionieren können, wenn kein Benutzer angemeldet ist. Es gibt (aber auch nur bis Windows XP) die Möglichkeit, einen Dienst mit dem Desktop eines Benutzers interagieren zu lassen, aber das ist ein Sicherheitsproblem. Siehe http://en.wikipedia.org/wiki/Shatter_attack Dann soll er sich eben alles in eine logfile schreiben lassen,Das ist ja genau das, was nicht funktioniert Zitieren
.NETter Geschrieben 1. September 2010 Geschrieben 1. September 2010 Hallo, ich würde den Dienst ganz einfach debuggen... Da sich ein Dienst nicht mittels F5 starten lässt muss man die Dienstanwendung "Neu erstellen" und zwar im Debug-Modus (Release kopiert die .pdb-Datei nicht mit). Anschließend wird der Dienst installiert (Setup basteln oder installutil.exe nutzen) und gestartet. Wenn man das entsprechende Projekt nun im Studio noch geöffnet hat kann man sich hier an einen Prozess anhängen (Extras-->An Prozess anhängen). Hier muss dararauf geachtet werden dass alle Prozesse aller Benutzer angezeigt werden (Checkboxen im unteren Bereich der Prozessauflistung). Dann wird der entsprechende Dienst aus der Liste ausgewählt, noch ein klick auf "Anfügen" und fertig. Jetzt kann man im Quellcode wie gewohnt Haltepunkte an gewünschte Stellen setzen und der Prozess wird dort anhalten. Und man kann mit F10 Schritt für Schritt durch den Code wandern. So sollte man den Fehler recht schell finden können. Viele Grüße, Thomas Zitieren
Luze Geschrieben 2. September 2010 Autor Geschrieben 2. September 2010 so hallo, ich habe jetzt schon einige Szenarien durchgespielt, andere Konten, debuggen etc. Mir ist beim debuggen aufgefallen, dass scheinbar das enthaltene Timer event nie ausgelöst wird. Ich erkläre mal so, in der OnStart() Methode wird ein Timer aktiviert und gestartet, aber auch ein Hintergrundthread, der TCP connections checkt, normalerweise sollte der Hintergrundthread doch das Timer Event nicht beeinflussen oder etwa doch? ich habe den Threadstart mal rausgenommen uhnd erneut debuggt, und trotzdem tritt das Event Timer_tick nicht auf, und ja ich bin mir sicher, dass der Timer gestartet wird Zitieren
Klotzkopp Geschrieben 2. September 2010 Geschrieben 2. September 2010 Wenn man sich mal die Dokumentation der Timer-Klassen anguckt, sieht man schnell, welche für Dienste bzw. Multithreading geeignet ist. Timer Class (System.Timers) Timer Class (System.Windows.Forms) Hat dein Dienst ein GUI? Ich hoffe doch nicht. Zitieren
Luze Geschrieben 2. September 2010 Autor Geschrieben 2. September 2010 (bearbeitet) also da Dienste kein GUI besitzen, hat meiner natürlicha auch keins, das Grundgerüst ist von Visual Studio Pro 2008 entworfen worden. Das mit den Timern ist interessant, möglich, dass es daran liegt, ich werds mal testen Edit: Die Vermutung, die ich schonmal hatte hat sich bestätigt, das Timer Event wurde nie ausgelöst, allerdings weil Objektverweis wurde nicht auf eine Objektinstanz gelegt.... Bearbeitet 2. September 2010 von Luze Zitieren
.NETter Geschrieben 2. September 2010 Geschrieben 2. September 2010 Hallo, ja der Timer von Windows wird so nicht greifen. Ich habe hier mal etwas funktionsfähigen Code: public partial class WriteService : ServiceBase { System.Timers.Timer tim = new System.Timers.Timer(10000); public WriteService() { InitializeComponent(); } protected override void OnStart(string[] args) { tim.Enabled = true; tim.Elapsed += new System.Timers.ElapsedEventHandler(tim_Elapsed); using(StreamWriter sw = new StreamWriter(@"c:\AAALog.txt", true)) { sw.WriteLine("Service has started at " + DateTime.Now.ToLongTimeString()); sw.Close(); } } void tim_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { using(StreamWriter sw = new StreamWriter(@"c:\AAALog.txt", true)) { sw.WriteLine("Service is running " + DateTime.Now.ToLongTimeString()); sw.Close(); } } protected override void OnStop() { using(StreamWriter sw = new StreamWriter(@"c:\AAALog.txt", true)) { sw.WriteLine("Service has stopped at " + DateTime.Now.ToLongTimeString()); sw.Close(); } } } Der Service schreibt in eine datei wenn er startet, beendet wird und zwischendurch (Timer) alle 10 Sekunden. Viele Grüße, Thomas Zitieren
Luze Geschrieben 2. September 2010 Autor Geschrieben 2. September 2010 (bearbeitet) Vielen Dank, durch deinen Code läuft mein Dienst jetzt Ordnungsgemäß =) Allen anderen natürlich auch danke für eure Bemühungen. Bearbeitet 2. September 2010 von Luze Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.