Vorgehensweise: Verwenden eines Windows-Dienstes als Host für ein Remoteobjekt
Auf dieser Seite
Zielsetzung
Betrifft
Verwendung dieses Moduls
Zusammenfassung
Benötigte Kenntnisse
Erstellen der "RemoteObject"-Klasse
Erstellen einer Hostanwendung auf Basis eines Windows-Dienstes
Erstellen eines Windows-Kontos zum Ausführen des Dienstes
Installieren des Windows-Dienstes
Erstellen einer Test-Clientanwendung
Weitere Ressourcen
Zielsetzung
Themenbereiche:
Verwenden eines Windows-Dienstes als Host für ein Remoteobjekt
Zugreifen auf ein Remoteobjekt über einen TCP-Kanal von einer Clientanwendung aus
Betrifft
Die Informationen in diesem Modul gelten für folgende Produkte und Technologien:
Microsoft Windows XP oder Windows 2000 Server (mit Service Pack 3) und höhere Betriebssysteme
Microsoft .NET Framework Version 1.0 (mit Service Pack 2) und höhere Versionen
Microsoft Visual Studio® 1.0 .NET und höhere Versionen
Microsoft Visual C#® .NET
Verwendung dieses Moduls
Empfehlungen für eine erfolgreiche Arbeit mit diesem Modul:
Sie sollten über Erfahrung in der Programmierung mit Visual C# .NET verfügen.
Sie müssen über Erfahrung mit der Entwicklungsumgebung Visual Studio .NET verfügen.
Sie müssen über Erfahrung in der Entwicklung und Implementierung von Windows-Diensten verfügen.
Sie müssen mit der Erstellung von Windows-Benutzerkonten mithilfe der Windows-Verwaltungsprogramme vertraut sein.
Zusammenfassung
Für Remoteobjekte, die über die Remoting-Funktion von Microsoft® .NET Framework Remoting erstellt werden, müssen Microsoft Windows®-Dienste, benutzerdefinierte ausführbare Programme oder ASP.NET als Host fungieren, damit Clientanwendungen darauf zugreifen können. In diesem Modul wird erläutert, wie Sie einen Windows-Dienst als Host für ein Remoteobjekt verwenden und das Remoteobjekt von einer Clientanwendung aus aufrufen.
Benötigte Kenntnisse
Bevor Sie mit diesem Modul beginnen, sollten Sie sich über folgende Punkte im Klaren sein:
Für Remoteobjekte können Windows-Dienste, benutzerdefinierte ausführbare Dateien und ASP.NET als Host fungieren.
Clients kommunizieren über den TCP-Kanal mit Remoteobjekten, für die benutzerdefinierte ausführbare Dateien oder Windows-Dienste als Host fungieren.
Mit Remoteobjekten, für die ASP.NET als Host fungiert, kommunizieren Clients über den HTTP-Kanal.
Wenn Sicherheit oberstes Gebot ist, sollte ASP.NET als Objekthost fungieren und der HTTP-Kanal verwendet werden. Auf diese Weise profitieren Sie von den Sicherheitsfunktionen von ASP.NET und IIS.
Weitere Informationen zum Hosting eines Remoteobjekts in ASP.NET (mit IIS) finden Sie im Artikel 312107, "HOW TO: Host a Remote Object in Microsoft Internet Information Services" (englischsprachig), der Microsoft Knowledge Base unter:
https://support.microsoft.com/default.aspx?scid=312107.Wenn es in erster Linie um die Leistungsfähigkeit geht, sollten Sie einen Windows-Dienst als Objekthost und den TCP-Kanal verwenden. Diese Option bietet jedoch keine integrierten Sicherheitsfunktionen.
Erstellen der "RemoteObject"-Klasse
In diesem Verfahren wird eine einfache RemoteObject-Klasse erstellt. Diese Klasse stellt eine einzige Methode mit Namen Addieren bereit, die zwei Zahlen addiert und das Ergebnis zurückgibt.
So erstellen Sie die "RemoteObject"-Klasse
Starten Sie Visual Studio .NET und erstellen Sie ein neues Visual C#-Klassenbibliotheksprojekt mit Namen RemoteObject.
Benennen Sie Class1.cs im Projektmappen-Explorer in Calculator.cs um.
Benennen Sie in Calculator.cs die Klasse Class1 in Calculator um und weisen Sie auch dem Standardkonstruktor den entsprechenden Namen zu.
Leiten Sie die Calculator-Klasse von MarshalByRefObject ab, um die Klasse remotefähig zu machen.
public class Calculator : MarshalByRefObject
Fügen Sie der Calculator-Klasse die folgende Methode vom Typ public hinzu.
public int Add( int operand1, int operand2 ) { return operand1 + operand2; }
Klicken Sie im Menü Erstellen auf Projektmappe erstellen.
Erstellen einer Hostanwendung auf Basis eines Windows-Dienstes
Mit diesem Verfahren wird eine Windows-Dienstanwendung erstellt, die als Host für das Remoteobjekt verwendet wird. Wenn der Dienst gestartet wird, konfiguriert dieser den TCP-Remotingkanal so, dass eingehende Clientanforderungen abgefragt werden.
Hinweis: Bei diesem Verfahren wird eine Installer-Klasse und das Befehlszeilendienstprogramm Installutil.exe zum Installieren des Windows-Dienstes eingesetzt. Zum Deinstallieren des Dienstes führen Sie Installutil.exe mit der Option /u aus. Wahlweise können Sie auch ein Setup- und Weitergabeprojekt für die Installation und Deinstallation des Windows-Dienstes verwenden.
So erstellen Sie eine Hostanwendung auf Basis eines Windows-Dienstes
Fügen Sie dem aktuellen Projekt mit Visual C# ein neues Windows-Dienstprojekt mit Namen RemotingHost hinzu.
Benennen Sie Service1.cs im Projektmappen-Explorer in RemotingHost.cs um.
Benennen Sie in RemotingHost.cs die Klasse Service1 in HostService um und weisen Sie auch dem Standardkonstruktor den entsprechenden Namen zu.
Fügen Sie am Anfang der Datei unterhalb der vorhandenen using-Anweisungen die folgende using-Anweisung hinzu.
using System.Runtime.Remoting;
Suchen Sie die Main-Methode und ersetzen Sie die vorhandene Codezeile, mit der die ServicesToRun-Variable initialisiert wird, durch die folgende Zeile.
ServicesToRun = new System.ServiceProcess.ServiceBase[] { new HostService() };
Suchen Sie die InitializeComponent-Methode und legen Sie die ServiceName-Eigenschaft auf RemotingHost fest.
this.ServiceName = "RemotingHost";
Suchen Sie die OnStart-Methode und fügen Sie die folgende Codezeile zum Konfigurieren von Remoting hinzu. Der vollqualifizierte Pfad zur Konfigurationsdatei wird als Startparameter an den Dienst übergeben.
RemotingConfiguration.Configure(args[0]);
Fügen Sie dem Projekt eine neue C#-Klassendatei mit Namen HostServiceInstaller hinzu.
Fügen Sie einen Assemblyverweis auf die Assembly System.Configuration.Install.dll hinzu.
Fügen Sie am Anfang von HostServiceInstaller unterhalb der vorhandenen using-Anweisung die folgenden using-Anweisungen hinzu.
using System.ComponentModel; using System.ServiceProcess; using System.Configuration.Install;
Leiten Sie die HostServiceInstaller-Klasse von der Installer-Klasse ab.
public class HostServiceInstaller : Installer
Fügen Sie das RunInstaller-Attribut auf Klassenebene wie folgt hinzu:
[RunInstaller(true)] public class HostServiceInstaller : Installer
Fügen Sie der HostServiceInstaller-Klasse die beiden folgenden Membervariablen vom Typ private hinzu. Diese Objekte werden beim Installieren des Dienstes verwendet.
private ServiceInstaller HostInstaller; private ServiceProcessInstaller HostProcessInstaller;
Fügen Sie dem Konstruktor der HostServiceInstaller-Klasse den folgenden Code hinzu.
HostInstaller = new ServiceInstaller(); HostInstaller.StartType = System.ServiceProcess.ServiceStartMode.Manual; HostInstaller.ServiceName = "RemotingHost"; HostInstaller.DisplayName = "Rechnerhostdienst"; Installers.Add (HostInstaller); HostProcessInstaller = new ServiceProcessInstaller(); HostProcessInstaller.Account = ServiceAccount.User; Installers.Add (HostProcessInstaller);
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf RemotingHost, zeigen Sie auf Hinzufügen und klicken Sie dann auf Neues Element hinzufügen.
Klicken Sie in der Liste Vorlagen auf Textdatei und nennen Sie die Datei app.config.
Konfigurationsdateien mit dem Namen app.config werden von Visual Studio .NET als Teil des Erstellungsprozesses automatisch in den Ausgabeordner (z. B. Projektverzeichnis\bin\debug) kopiert und in Anwendungsname.config umbenannt.Klicken Sie auf OK, um die neue Konfigurationsdatei hinzuzufügen.
Fügen Sie der neuen Konfigurationsdatei die folgenden Konfigurationselemente hinzu.
<configuration> <system.runtime.remoting> <application name="RemoteHostService"> <service> <wellknown type="RemoteObject.Calculator, RemoteObject" objectUri="RemoteObject.Calculator" mode="Singleton" /> </service> <channels> <channel ref="tcp" port="8085"> <serverProviders> <formatter ref="binary" /> </serverProviders> </channel> </channels> </application> </system.runtime.remoting> </configuration>
Klicken Sie im Menü Erstellen auf Projektmappe erstellen.
Erstellen eines Windows-Kontos zum Ausführen des Dienstes
Mit diesem Verfahren wird ein Windows-Konto erstellt, das zum Ausführen des Windows-Dienstes verwendet wird.
So erstellen Sie ein Windows-Kontos zum Ausführen des Dienstes
Erstellen Sie ein neues lokales Benutzerkonto mit Namen RemotingAccount. Geben Sie ein Kennwort ein und aktivieren Sie das Kontrollkästchen Kennwort läuft nie ab.
Klicken Sie in der Programmgruppe Verwaltung auf Lokale Sicherheitsrichtlinie.
Weisen Sie dem neuen Konto mithilfe des Tools Lokale Sicherheitsrichtlinie das Recht Als Dienst anmelden zu.
Installieren des Windows-Dienstes
In diesem Verfahren wird der Windows-Dienst über das Dienstprogramm Installutil.exe installiert und anschließend gestartet.
So installieren Sie den Windows-Dienst
Öffnen Sie ein Befehlsfenster und wechseln Sie in das Verzeichnis Bin\Debug im Projektordner RemotingHost.
Führen Sie das Dienstprogramm Installutil.exe aus, um den Dienst zu installieren.
installutil.exe remotinghost.exe
Geben Sie im Dialogfeld Dienstanmeldung festlegen den Benutzernamen und das Kennwort des im vorangegangenen Verfahren erstellten Kontos ein und klicken Sie auf OK.
Zeigen Sie die Ausgabe des Dienstprogramms Installutil.exe an und vergewissern Sie sich, dass der Dienst ordnungsgemäß installiert wurde.Kopieren Sie die Assembly RemoteObject.dll in das Ausgabeverzeichnis des RemotingHost-Projekts (d. h. nach RemotingHost\Bin\Debug).
Starten Sie in der Programmgruppe Verwaltung das MMC-Snap-In Dienste.
Klicken Sie in der Liste Dienste mit der rechten Maustaste auf Rechnerhosdienst und dann auf Eigenschaften.
Geben Sie den vollständigen Pfad zur Konfigurationsdatei des Dienstes (remotinghost.exe.config) in das Feld Startparameter ein.
Hinweis: Dies ist im Handumdrehen erledigt, wenn Sie den Inhalt des Feldes Pfad zur EXE-Datei kopieren und diesen in das Feld Startparameter einfügen. Fügen Sie anschließend die Zeichenfolge ".config" an.
Klicken Sie auf Starten, um den Dienst zu starten.
Vergewissern Sie sich, dass sich der Status des Dienstes in Gestartet ändert.
Klicken Sie auf OK, um das Dialogfeld Eigenschaften zu schließen.
Erstellen einer Test-Clientanwendung
Mit diesem Verfahren wird eine Testkonsolenanwendung erstellt, die zum Aufrufen des Remoteobjekts innerhalb des Windows-Dienstes verwendet wird.
So erstellen Sie eine Test-Clientanwendung
Fügen Sie dem aktuellen Projekt eine neue Visual C#-Konsolenanwendung mit Namen RemotingClient hinzu.
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf RemotingClient und dann auf Als Startprojekt festlegen.
Fügen Sie einen Assemblyverweis auf die Assembly System.Runtime.Remoting.dll hinzu.
Fügen Sie dem RemoteObject-Projekt einen Projektverweis hinzu.
Fügen Sie am Anfang von class1.cs unterhalb der vorhandenen using-Anweisungen die folgenden using-Anweisungen hinzu.
using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; using RemoteObject;
Fügen Sie der Main-Methode den folgenden Testcode hinzu, um das Calculator-Objekt aufzurufen, für das der Windows-Dienst als Host fungiert.
TcpChannel chan = new TcpChannel(); ChannelServices.RegisterChannel(chan); Calculator calc = (Calculator)Activator.GetObject( typeof(RemoteObject.Calculator), "tcp://localhost:8085/RemoteObject.Calculator"); if (calc == null) System.Console.WriteLine("Server konnte nicht gefunden werden"); else Console.WriteLine("21 + 21 is : " + calc.Add(21,21) );
Klicken Sie im Menü Erstellen auf Projektmappe erstellen.
Führen Sie die Clientanwendung aus und vergewissern Sie sich, dass im Konsolenausgabefenster das korrekte Ergebnis angezeigt wird.
Weitere Ressourcen
Weitere Informatioen zum Hosting eines Remoteobjekts in ASP.NET (mit IIS) finden Sie im Artikel 312107, "HOW TO: Host a Remote Object in Microsoft Internet Information Services" (englischsprachig), der Microsoft Knowledge Base unter: https://support.microsoft.com/default.aspx?scid=312107.