Autor Beitrag
Raven280438
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 99



BeitragVerfasst: Mo 01.09.14 11:13 
Hi,

ich habe einen Windows-Service, der VPN-Verbindungen aufbauen kann.

Jetzt möchte ich den Service über WCF steuern.

Mein Problem: Wie kann ich beim Erstellen des WCF-ServiceHosts Parameter an ihn übergeben?
Im Moment erstelle ich den Host so:
ausblenden C#-Quelltext
1:
this.ServiceHost = new ServiceHost(typeof(MyServiceController));					

Jetzt muss ich an den Service-Host (d.h. an die Klasse "MyServiceController") irgendwie ein Referenz auf die Verbindungs-Klasse des Windows-Service übergeben, damit die gesteuert werden können.

Wie mache ich das am Besten?


Gruß
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4121
Erhaltene Danke: 853

Win10
C#, C++ (VS 2015/17)
BeitragVerfasst: Mo 01.09.14 11:36 
Hallo,

benutze einfach den alternativen Konstruktor ServiceHost Constructor (Object, Uri[]) und erzeuge die Instanz deiner Service-Klasse selbst:
ausblenden C#-Quelltext
1:
2:
MyServiceController service = new MyServiceController(/*Parameter*/);
this.ServiceHost = new ServiceHost(service);
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4444
Erhaltene Danke: 914


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 01.09.14 11:43 
@TH69: So hast du daraus einen Singleton gemacht den sich alle, auch parallel Anfragen, teilen. Selten eine gute Idee ;)

Ich hab da gerade ein Déjà-vu. An der Stelle waren wir schonmal und die Antwort bleibt die selbe. Was weiß der Host des Service den mehr als der Service selber? Der Host müßte die Daten ja auch irgendwie ermitteln um in an den Service zu geben. Das macht wenig Sinn. Laß den Service die Daten/Settings die er braucht selbst ermitteln (möglicherweise in einer 3.ten dafür spezialisierten Klasse) und der Host macht nur eins den Service hosten.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4121
Erhaltene Danke: 853

Win10
C#, C++ (VS 2015/17)
BeitragVerfasst: Mo 01.09.14 12:17 
Hallo Ralf,

ja da hast du wohl recht.
Dann wäre wohl die Benutzung der IInstanceProvider-Schnittstelle der richtige Weg, s. How do I pass values to the constructor on my wcf service? (Antwort mit den meisten Votes)
Raven280438 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 99



BeitragVerfasst: Mo 01.09.14 12:40 
Hi,

erstmal danke für eure Antworten.

ich weis nicht, ob ich eure Lösungsansätze richtig verstanden habe...

Also ich habe den Windows-Service. Dieser hat eine Verbindungs-Klasse, die die kompletten VPN-Verbindungen steuert, speichert, etc.
Diese Verbindungsklasse soll so lange leben, wie der Windows-Service läuft. (Und auch alle VPN-Verbindungen offen halten)

Der WCF-Service (MyServiceController) soll dann nur auf Methoden der Verbindungs-Klasse zugreifen können, keine neue Klasse erstellen.
Wenn ich im MyServiceController immer neue Verbindungsklassen erstellt, werden im Windows-Service keine Informationen gespeichert, die länger leben als das Desktop Programm das sich zum WCF-Host verbindet, oder?



Ich hab mich noch nicht 100%ig mit der 2. Antwort von Th69 auseinander gesetzt, aber würde ich damit erreichen, was ich mir vorstelle?



Gruß
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4444
Erhaltene Danke: 914


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 01.09.14 12:48 
Zitat:
Wenn in im MyServiceController immer neue Verbindungsklassen erstellt, werden im Windows-Service keine Informationen gespeichert, die länger leben als das Desktop Programm das sich zum WCF-Host verbindet, oder?


Die Klasse wird für jeden Call neu erstellt und am Ende zerstört ja. Wie lang Informationen leben hängen damit zusammen wo du sie speicherst. Wenn du die nur an die gerade verwendete MyServiceController Instanz hängst sind die natürlich am Ende weg. Wenn du Daten länger brauchst leg sie in irgendwas ab das länger lebt.
Raven280438 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 99



BeitragVerfasst: Mo 01.09.14 12:53 
Hi,

ja genau das hab ich ja vor.

Alle Informationen die länger leben sollen, kommen in die Verbindungs-Klasse.

Um im WCF-Service damit arbeiten zu können, muss ich bei jedem Call ja irgendwie die Referenz der Klasse beim Erstellen an den MyServiceController übergeben.

Und genau da liegt im Moment mein Problem ;)


Gruß
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4444
Erhaltene Danke: 914


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 01.09.14 13:04 
Das würde der Link von TH69 tun der per DI eine Referenz in den ServicController schießt.

Aber ich wiederhole nochmal das ich das als Vermischung von Aufgaben empfinde die nicht zusammengehören. Der Host hostet. Der Service bietet seinen Service an. Wenn du etwas 3.tes hast das etwas 3.tes kann und vom Service gebraucht wird dann überlass es einer 3.ten Klasse. Wenn die zwischen den Service Instanzen geshared werden soll implementiert das im einfachsten Fall als kleinen Service(statische Klasse die eine Instanz dieses Service als Singleton veröffentlicht - mit Service ist hier nix von WCF oder Windows gemeint sondern allein das Muster). Dieses 3.te Klasse kannst du aber auch mit den DI Fähigkeiten von WCF verwalten lassen und dir eben beim Konstruieren in deine Klasse schießen lassen. Das steht dir offen. Denke daran das auf dieses 3.te, egal ob es eine 3.te Klasse ist oder doch nur die Windows Service Klasse, parallel aus verschiedene Threads zugegriffen wird. Da mußt du voraussichtlich ein paar Synchronisierungsmaßnahmen einbauen.
Raven280438 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 99



BeitragVerfasst: Mo 01.09.14 13:25 
Hi,

die "3.te Klasse" bei mir ist ja die Verbindungs-Klasse.

Der WCF-Service leitet die Anfragen im Prinzip nur zur Verbindungs-Klasse weiter

ausblenden C#-Quelltext
1:
2:
3:
4:
public void DisconnectVPN(String IP)
{
    ConnectClass.DisconnectVPN(IP);
}



Gruß
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4444
Erhaltene Danke: 914


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 01.09.14 13:56 
Zitat:
die "3.te Klasse" bei mir ist ja die Verbindungs-Klasse.


Ah. Warum kann Deutsch nicht so einfach sein wie eine Programmiersprache dann hätte ich bemerkt das du nicht den WindowsService meinst ;)