WindowsDienst Anwendung mit MS SQL Zugriff
-
Dienstag, 11. September 2012 17:50
Hallo,
ich versuche gerade meinen ersten Windows-Dienst zu schreiben, welcher alle 30 Sekunden auf eine MS SQL Datenbank zugreifen soll.
Wie greife ich auf die DB zu aus dem Service? Ich weiß vorher noch nicht, wie die DB heißt und wo sie im Netzwerk liegt, d. h. ich muss irgendwie extern dem Service eine Quelle schaffen, wo die erforderlichen Daten liegen.
Wie kann man soetwas lösen?
Ich hatte es mit einem Modul in einer ASP.NET Anwendung probiert - funktioniert aber nicht so wie es sein soll. Dort gab man mir den Tipp, das Ganze mit einem Windows-Dienst zu lösen.
Könnt Ihr mir hier bitte weiterhelfen, da das morgen laufen soll und ich noch im Dunkeln stochere?
Liebe Grüße
Claudia
Alle Antworten
-
Dienstag, 11. September 2012 18:54
Hallo Claudia,
wenn Du noch nie einen Dienst entwickelt hast, wird der morgen nicht fertig sein. Da sehe ich keine Chance.
Den ersten Schritt kannst Du machen, indem Du den ConnectionString in der app.config hinterlegst, eine Verbindung aufbaust und deinen Code soweit schreibst, dass es generell funktionieren würde.
Im zweiten Schritt kannst Du dann (d)einen Webservice durch Hinzufügen eines Webverweis einbinden. Der Webservice sollte dann eine Methode bereitstellen, über die Du dir die Verbindungsdaten für den richtigen SQL Server holst (bitte per SSL ansprechen und mit User/Passwort sichern sowie ggfs. noch zusätzlich verschlüsseln, ansonsten kann den Service ja jeder aufrufen und alles mitlesen.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Dienstag, 11. September 2012 19:02
Hallo Stefan,
ich brauche eigentlich keinen Webservice. Der Windows-Dienst soll auf der gleichen Maschine (Server 2008 R2) laufen auf der auch der IIS7 installiert ist. Alle Daten, welche ausgewertet werden sollen, befinden sich in der DB.
Geht es so einfacher?
LG
Claudia
-
Dienstag, 11. September 2012 19:07
Hallo Claudia,
Der Windows-Dienst soll auf der gleichen Maschine (Server 2008 R2) laufen auf der auch der IIS7 installiert ist. Alle Daten, welche ausgewertet werden sollen, befinden sich in der DB.
öhm. Was denn nu?
Ich weiß vorher noch nicht, wie die DB heißt und wo sie im Netzwerk liegt, d. h. ich muss irgendwie extern dem Service eine Quelle schaffen, wo die erforderlichen Daten liegen.
Das ist doch komplett das Gegenteil von dem, was Du vorher geschrieben hast.
Wie es geht, wenn Du weißt, wo der SQL Server liegt und wie Du dich mit diesem verbinden kannst (ggfs. auch erst auf dem jeweiligen Zielsystem), hab ich dir oben geschrieben. Lager den ConnectionString in die app.config aus (ist in großen Teilen identisch zur web.config einer Webanwendung), dann kann man den ConnectionString ganz einfach auf dem Zielsystem ändern.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Dienstag, 11. September 2012 20:04
Hallo Stefan,
ich verstehe es immer wieder, das ich missverstanden werde;-)
Bisher hatte ich in meiner Webanwendung mit einem Modul versucht, auf bestimmte Ereignisse zu reagieren welche sich auf dem SQL Server befinden. Das führte aber nicht zum Erfolg (in ASP.NET Forum). Daher versuche ich jetzt, Deinen Tipp umzusetzen. Der Service wird auch auf den Windows Server 2008 R2 aufgesetzt. Der Administrator gibt uns jedoch die Datenbank vor, welche später auf dem Livesystem verwendet wird. das meinte ich damit, das ich zum jetzigen Zeitpunkt nicht weiss, wie der spätere Connectionstring aussieht. Das mit der app.config war schon ein super Hinweis.
Wie kann man aus einer Windows-Dienst Emails versenden?
LG
Claudia
-
Dienstag, 11. September 2012 20:42
Hallo Claudia,
Wie kann man aus einer Windows-Dienst Emails versenden?
wie aus jeder anderen Anwendung heraus auch. Schrieb ich doch schon im ASP.NET Forum.
Weißt Du nicht, wie man generell Emails versendet oder nur nicht, wie es aus einem Dienst gehen soll. Falls letzteres -> geht genauso wie in anderen Anwendungen auch.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Mittwoch, 12. September 2012 07:52
Ich habe es geschafft, den Service fertigzustellen. Auf meinem Windows7 Rechner habe ich den Service auch erfolgreich eingebunden und er funktioniert.
Nun habe ich auf unserem Webserver den Server installiert und gestartet. Als Connection String habe ich den String aus der web.config genommen. Der Dienst lässt sich auch starten und wird auch ausgeführt (habe dazu eine Logdatei, welche jeden Tick alle 30 Sekunden mitloggt und die Exceptions).
Das ist meine Install-Klasse:
[RunInstaller(true)] public class WSNotificationInstaller : Installer { private ServiceInstaller m_ThisService; private ServiceProcessInstaller m_ThisServiceProcess; public WSNotificationInstaller() { m_ThisService = new ServiceInstaller(); m_ThisServiceProcess = new ServiceProcessInstaller(); m_ThisServiceProcess.Account = ServiceAccount.LocalSystem; m_ThisService.ServiceName = "PlayerNotification"; m_ThisService.StartType = ServiceStartMode.Manual; Installers.Add(m_ThisService); Installers.Add(m_ThisServiceProcess); } }Ich erhalte beim Ausführen des Service folgenden Fehler, womit ich nichts anfangen kann:
"Netzwerkbezogener oder instanzspezifischer Fehler beim Herstellen einer Verbindung mit SQL Server. Der Server wurde nicht gefunden, oder auf ihn kann nicht zugegriffen werden. Überprüfen Sie, ob der Instanzname richtig ist und ob SQL Server Remoteverbindungen zulässt. (provider: SQL Network Interfaces, error: 26 - Fehler beim Bestimmen des angegebenen Servers/der angegebenen Instanz)".
Könnt ihr mir bitte weiterhelfen?
Liebe Grüße
Claudia
-
Mittwoch, 12. September 2012 08:04
Hallo Claudia,
ich würde dich bitten die Punkte aus dem Blog-Eintrag SQL Network Interfaces, error: 26 - Error Locating Server/Instance Specified durchzugehen und vielleicht hast du ja damit schon das Problem/den Fehler behoben.
Gruß
Rudolf
"Der Nachteil der Intelligenz besteht darin, dass man ununterbrochen gezwungen ist, dazuzulernen." Georg Bernhard Shaw -
Mittwoch, 12. September 2012 09:23
Ich habe festgestellt, dass der connection string aus der app.config nicht genommen wird.
In meinem Dienst habe ich folgendes gemacht:
- app.config:
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> </configSections> <connectionStrings> <add name="ConnectionOne" connectionString="Data Source=LENOVO_LAB\SQLEXPRESS;Initial Catalog=uebung1DB;Integrated Security=True" providerName="System.Data.SqlClient" /> </connectionStrings> <appSettings> <add key="deltime" value="3"/> <add key="servername" value=""/> <add key="port" value="25"/> <add key="user" value=""/> <add key="password" value=""/> <add key="emailaddress" value=""/> </appSettings> </configuration>- Code:
ConnectionStringSettings connectionInfo; private void MakeNotifications() { connectionInfo = ConfigurationManager.ConnectionStrings["ConnectionOne"]; ... }Ändere ich jetzt den ConnectionString in der app.config ab wird dieser nicht übernommen. Was habe ich hier falsch gemacht?
Noch eine Frage zu "m_ThisServiceProcess.Account = ServiceAccount.LocalSystem;" - Ist LocalSystem richtig oder soll ich hier was anderes wählen?
LG
Claudia
-
Mittwoch, 12. September 2012 10:29
Hallo Clauda,
soweit ich das sehe ist an dem Quelltext alles in Ordnung. Bist du dir überhaupt sicher, dass die MakeNotifications() auch nach deinen Änderungen an der app.conf aufgerufen wird und hier der "falsche" ConnectionString zurückgeliefert wird oder geht es darum, dass diese Methode gar nicht aufgerufen wird?
Die Berechtigungen die man dem Dienst als Account mitgeben kann sind in der Dokumentation zu ServiceAccount-Enumeration aufgeführt. Mit dem Account "LocalSystem" hat man lokal auf alle Ressourcen Zugriff. Das heißt zum Einen dass man keine Probleme bekommt weil man mal zuwenig Rechte hat aber zum Anderen auch, dass ein Dienst mit den Berechtigungen auch viel anstellen kann.
Bei der Sicherheit kann man folgendes sagen, dass man Grundsätzlich nur so viel Rechte wie nötig und sowenig wie Möglich geben sollte. Dies bedeutet aber manchmal auch dass man viel Zeit investieren muss um die "perfekte" Stufe zu finden und Fehler zu analysieren.
Da du den Dienst selbst entwickelst und das in deinem eigenen Interesse ist, sollte nichts dagegen sprechen den Dienst unter diesem Account laufen zu lassen (ich lasse mich aber gerne des Besseren belehren!)
Gruß
Rudolf
"Der Nachteil der Intelligenz besteht darin, dass man ununterbrochen gezwungen ist, dazuzulernen." Georg Bernhard Shaw -
Mittwoch, 12. September 2012 11:19
Hallo Claudia,
die app.config heißt nur zur Entwicklungszeit so. Wenn man kompiliert, wird daraus eine <DateinameDerAssembly>.config. Wenn deine Anwendung also DeinService.exe heißt, heißt die Config Datei dann DeinService.exe.config und sollte im selben Verzeichnis liegen wie die Assembly auch.
Ggfs. hilft das ja schon.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort markiert Ionut DumaMicrosoft Contingent Staff, Moderator Donnerstag, 11. Oktober 2012 10:50
-
Freitag, 14. September 2012 20:29
Danke. Ich hatte es erst später gesehen, dass die exe.config mit generiert wurde. Es klappt prima.
Claudia
-
Donnerstag, 11. Oktober 2012 10:49Moderator
Hallo Claudia,
Es freut uns dass Du Dein Problem lösen könntest, in die Zukunft bitte markiere "als Antwort" der Antwort die Dir geholfen hat.
Danke und Grüß,
Ionut
- Bearbeitet Ionut DumaMicrosoft Contingent Staff, Moderator Donnerstag, 11. Oktober 2012 10:49

