[WCF] Een wcf server service en wcf service service

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
mja misschien wel wazigste topictitel ooit, maar het zit zo:

huidige situatie
ik heb een windows service, die doet dingen

wens
ik wil dmv wcf gegevens (config settings) in die service wijzigen

aannamen
Om een wcf service te hosten heb je een hoster nodig (iets als hieronder)
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        private void ServerThread()
        {
            Type _InstanceType = typeof(<mijnnamespace>.<mijn wcf service>);
            ServiceHost host = new ServiceHost(_InstanceType);
            using (host)
            {
                host.Open();

                while (!serviceStarted) { Thread.Sleep(100); }

                host.Close();
            }
            Thread.CurrentThread.Abort();
        }

Bij mij is dit dus een service (windows service)

vraag
Kan ik uberhaupt een bestaande windows service dmv wcf benaderen? of moet ik de wcf service altijd zelf 'hosten' dmv mijn 'server'-service (dus de hierbovenstaande code)?

vanwaar de vraag
Ik denk (ben bang) dat ik zodra ik dmv wcf bij mijn service wil komen, en ik dit doe dmv mijn serviceServer, ik een nieuwe instantie maak van de service.
Ook denk ik dat als ik hem static maak, dit nog steeds het geval is, omdat ik dan twee dingen heb:

1: een windows service die toevallig een interface heeft die ook een aantal wcf opties implementeren
2: een library die wcf ondersteund en waarvan de server (ook windows service) een instance aanmaakt (en beheerd)

kloppen mijn vermoedens?

en zo ja, hoe kan ik zoiets dan het beste oplossen?

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
WCF doet niets anders dan een communicatiekanaal opzetten tussen 2 executables (al dan niet op dezelfde machine). Als jij met je service een WCF-server host, dan kun je die met een client benaderen. Deze zal in dezelfde runtime draaien als de service en als je een reference naar het service object meegeeft aan de hosting thread, dan kun je prima properties en methods benaderen van de service.

Maar goed, waarom probeer je het niet gewoon uit? Maak bijvoorbeeld een service aan die een uniek nummer random meekrijgt tijdens de startup en log dit naar een tekstbestand, oid. Start tijdens de startup een WCF host thread op. Laat de client verbinden met de host en vraag dat unieke nummer op aan de host. Vergelijk dat nummer met wat in de tekstfile terugkomt en voila, je kunt zien of de WCF host hetzelfde service object geraadpleegd heeft,

Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
bigbeng schreef op maandag 17 november 2008 @ 23:41:
WCF doet niets anders dan een communicatiekanaal opzetten tussen 2 executables (al dan niet op dezelfde machine). Als jij met je service een WCF-server host, dan kun je die met een client benaderen. Deze zal in dezelfde runtime draaien als de service en als je een reference naar het service object meegeeft aan de hosting thread, dan kun je prima properties en methods benaderen van de service.
Ik denk dat je me verkeerd begrijpt.

Zoals jij het zegt klopt het, je opent een kanaaltje van Server naar Client, echter de client is in dit geval een dom ding, dus die weet niks. Dus een instance meegeven gaat niet werken.
Verder is het probleem ook niet zozeer het communicatiekanaaltje, maar het feit dat er naast de server (de host) een apparte windows service draait, die ik wil gaan aanspreken. Dit is een op zichzelf draaiend proces. (een full text indexer in mijn geval.)

edit:
ik krijg het momenteel niet eens voor elkaar om een wcf service te hosten, dus 'even testen' is er nog even niet bij ;)

Ik denk dat het komt omdat mijn service niet alleen een interface heeft met daarin zijn contract, maar ook een interface 'ServiceBase' (van windows service), maar dat laatste weet ik niet helemaal zeker

[ Voor 14% gewijzigd door BasieP op 18-11-2008 09:28 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Nou als jij dezelfde code gebruik als dat er in je TS staat dan vindt ik het helemaal niet gek dat het je niet lukt om je wcf service te hosten. :P

C#:
1
2
3
4
5
6
7
8
using (host)
            {
                host.Open();

                while (!serviceStarted) { Thread.Sleep(100); }

                host.Close();
            } 


Je opent je host, vervolgens wacht je even tot dat je service gestart is, om vervolgens de host weer te sluiten (en dus je service weer te killen0. Ik bedoel.. tjah..niet echt vreemd dat t dan niet werkt :+

Antwoord op je vraag of je standaard met wcf een windows service kan benaderen? Nee. Als je dat wilt (en dat is denk ik het meest handigste gezien vanuit wat je wilt bereiken) dan zul je zelf een wcf service moeten hosten in je windows service.

Ik denk (ben bang) dat ik zodra ik dmv wcf bij mijn service wil komen, en ik dit doe dmv mijn serviceServer, ik een nieuwe instantie maak van de service.

Waarom denk je dat? We hebben het hier toch over een Windows Service?
Ik denk dat het komt omdat mijn service niet alleen een interface heeft met daarin zijn contract, maar ook een interface 'ServiceBase' (van windows service), maar dat laatste weet ik niet helemaal zeker
Aah dat verklaart t een en ander...
Waarom zou je je wcf service willen laten over erven van ServiceBase 8)7 . Ik snap wat je wilt bereiken maar ik zou het zo niet doen (naast dat het niet werkt :P).

Stel je hebt een windows service die constant mail gaat ophalen ofzo.
Implementeer gewoon een normale windows service. Start aan de ene kant de code voor het ophalen van je mail, en start aan de andere kant een thread die je wcf service host.
Vervolgens moet je alleen nog bedenken hoe je je wcf service gegevens uit je "mail ophaal code" gaat halen.

Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
D-Raven schreef op dinsdag 18 november 2008 @ 10:18:
Nou als jij dezelfde code gebruik als dat er in je TS staat dan vindt ik het helemaal niet gek dat het je niet lukt om je wcf service te hosten. :P

C#:
1
2
3
4
5
6
7
8
using (host)
            {
                host.Open();

                while (!serviceStarted) { Thread.Sleep(100); }

                host.Close();
            } 


Je opent je host, vervolgens wacht je even tot dat je service gestart is, om vervolgens de host weer te sluiten (en dus je service weer te killen0. Ik bedoel.. tjah..niet echt vreemd dat t dan niet werkt :+
je neemt wat foutieve aannamen.
serviceStarted is een bool die alleen in de StopService en de StartService geset wordt. Dus pas zodra ik de windows service stop wordt de bool veranderd, en close ik de host. (hij joint dan threads etc.)
Antwoord op je vraag of je standaard met wcf een windows service kan benaderen? Nee. Als je dat wilt (en dat is denk ik het meest handigste gezien vanuit wat je wilt bereiken) dan zul je zelf een wcf service moeten hosten in je windows service.

Ik denk (ben bang) dat ik zodra ik dmv wcf bij mijn service wil komen, en ik dit doe dmv mijn serviceServer, ik een nieuwe instantie maak van de service.

Waarom denk je dat? We hebben het hier toch over een Windows Service?
Correct, maar als ik dmv een wcf server een instantie maak van mijn service object, dan is dat service object volgens mij geen windows service, maar gewoon een object binnen de wcf server (wat dan an sich ook wel weer een windows service kan zijn)
[...]

Aah dat verklaart t een en ander...
Waarom zou je je wcf service willen laten over erven van ServiceBase 8)7 . Ik snap wat je wilt bereiken maar ik zou het zo niet doen (naast dat het niet werkt :P).
Omdat mijn hoofdproces gewoon constant moet draaien, en het een windows service moet zijn.
Stel je hebt een windows service die constant mail gaat ophalen ofzo.
Implementeer gewoon een normale windows service. Start aan de ene kant de code voor het ophalen van je mail, en start aan de andere kant een thread die je wcf service host.
Vervolgens moet je alleen nog bedenken hoe je je wcf service gegevens uit je "mail ophaal code" gaat halen.
ja dat is precies het probleem. (misschien wel beter uitgelegd dan ikzelf)
Zodra ik in die wcf service host een instantie van mijn wcf service ga maken, dan heb ik al 2 processen draaien. en dat is precies wat ik niet wil. Ik wil juist bij het bestaande proces komen.

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 10-09 20:32
Mijn laatste alinea was niet de probleem omschrijving, maar meer de oplossing :)

Start gewoon je service en host daarin je wcf service

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public partial class MyService : ServiceBase
    {
        public MyService ()
        {
            InitializeComponent();

            processor = new MailProcessor(this);

            hoster = new MyWcfServiceHoster(processor);

            timer = new Timer(Settings.Default.MailCheckInterval);
            timer.Stop();
            timer.AutoReset = true;
            timer.Elapsed += timer_Elapsed;
        }

        protected override void OnStart(string[] args)
        {
           //start je timer
           // log naar eventlog service started
        }

        protected override void OnStop()
        {
            //stop je timer
           // log naar eventlog service started
        }

        //wellicht ook de continue of pause implementeren

        private void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            try
            {
                //zeg je mailprocessor om aan de slag te gaan
                processor.Proces();
            }
            catch (Exception ex)
            {
                log.WriteEntry("Error in service: " + ex.Message);
            }
        }
...


Dan krijg je dus zoiets. Dan heb je 1 proces waar alles in draait. Natuurlijk zijn er wel meerdere threads.
Zoals je ziet geef ik de instantie aan de wcf hoster mee. deze zal het dan aan je wcf service geven. Zodat deze de processor kan aansturen of zoiets dergelijks.
Dat is wat ik bedoelde :)
Pagina: 1