Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[WCF .NET 3.0] Self-hosted WCF Service, concurrent threads?

Pagina: 1
Acties:
  • 235 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo allemaal,

Ik ben bezig met mijn afstudeeropdracht bij een bedrijf en gebruik WCF services daarvoor. Momenteel host ik mijn WCF service in IIS, maar gezien het feit dat ik maar één bindary ga gebruiken bij de server en bij de client, wil ik deze WCF service in een Windows Service hosten. Dit is mij wel gelukt. Nu mijn vraag: Hoe zorg ik ervoor dat mijn WCF naar meerdere clients kan luisteren? Moet ik dit met een soort loop regelen zoals bij het programmeren van een socket of is er een optie in de bindary's en regelt de .NET framework dit voor je? Ik wil dat mijn service meerdere clients tegelijkertijd kan verzorgen met gegevens (Conccurent threading).

Momenteel wacht mijn ene browser totdat de andere klaar is. Dit wil ik voorkomen... Suggesties?

Verwijderd

Een soort loop is niet handig (ook niet bij sockets overigens), maar 1 (of meer) thread(s) per client en nette delegates die zich abonneren op de diverse events van die threads lijkt me the way to go.

/me heeft nog niks gedaan met .NET 3.0 en WCF, dus kan je niet precies zeggen hoe of wat...

Verwijderd

Topicstarter
Discover Mighty Instance Management Techniques For Developing WCF Apps

Dit artikel geeft heel wat aan over mijn topic. Zou ik dus, wanneer ik mijn service in een Windows Service applicatie zou hosten, dan gebruik moeten maken van Per-session services zoals uitgelegd in dit artikel? Iemand een advies?

  • .Gertjan.
  • Registratie: September 2006
  • Laatst online: 17-02 21:20

.Gertjan.

Owl!

Verwijderd schreef op woensdag 24 oktober 2007 @ 20:31:
Hallo allemaal,

Ik ben bezig met mijn afstudeeropdracht bij een bedrijf en gebruik WCF services daarvoor. Momenteel host ik mijn WCF service in IIS, maar gezien het feit dat ik maar één bindary ga gebruiken bij de server en bij de client, wil ik deze WCF service in een Windows Service hosten. Dit is mij wel gelukt. Nu mijn vraag: Hoe zorg ik ervoor dat mijn WCF naar meerdere clients kan luisteren? Moet ik dit met een soort loop regelen zoals bij het programmeren van een socket of is er een optie in de bindary's en regelt de .NET framework dit voor je? Ik wil dat mijn service meerdere clients tegelijkertijd kan verzorgen met gegevens (Conccurent threading).

Momenteel wacht mijn ene browser totdat de andere klaar is. Dit wil ik voorkomen... Suggesties?
Ik geloof dat er online ook diverse voorbeelden zijn waar men een soort webservertje opstart vanuit de WCF host. Het starten van een .NET Webservertje vanuit .NET code is geloof ik niet zo heel moeilijk en daar kan je dan het item in hosten, ben je niet afhankelijk van je IIS.

Misschien de moeite om daar eens op te zoeken? (kan ook zijn dat ik er helemaal naast zit hoor, heb wel ooit een webservertje moeten maken in mijn code, maar tot op heden slechts heel miniem gewerkt met .NET 3.0/WCF)

The #1 programmer excuse for legitimately slacking off: "My code's compiling"
Firesphere: Sommige mensen verdienen gewoon een High Five. In the Face. With a chair.


Verwijderd

Leuk artikel!
Bij niet te veel concurrent clients ('t artikel noemt "a few dozen (or perhaps up to a few hundred) outstanding clients") lijkt me per-session het handigst. Per-call kan dan ook nog wel, maar als je dan gegevens moet persisten tussen verschillende calls moet je zelf gaan serializen/deserializen en een eigen session management systeem bijhouden.

De overige genoemde mogelijkheden moet ik nog 's nader bekijken, en vooral uitproberen.
/me gaat binnenkort 's een .NET 3.0/WCF VM opzetten, want 't klinkt wel heel interessant! :)

Verwijderd

Topicstarter
Verwijderd schreef op woensdag 24 oktober 2007 @ 21:51:
Leuk artikel!
Bij niet te veel concurrent clients ('t artikel noemt "a few dozen (or perhaps up to a few hundred) outstanding clients") lijkt me per-session het handigst. Per-call kan dan ook nog wel, maar als je dan gegevens moet persisten tussen verschillende calls moet je zelf gaan serializen/deserializen en een eigen session management systeem bijhouden.

De overige genoemde mogelijkheden moet ik nog 's nader bekijken, en vooral uitproberen.
/me gaat binnenkort 's een .NET 3.0/WCF VM opzetten, want 't klinkt wel heel interessant! :)
Bedankt voor je antwoord. Inderdaad. Ik overweeg per-session dan ook toe te passen. Gelukkig hoef ik bij mij geen bronnen te delen. De locking mechanisme van de bestanden die door de service (sessions) benaderd kunnen worden worden al afgehandeld :) Dat hoef ik dus verder niet meer te regelen. Ik ga een opzetje alvast maken. Het is wel mooi dat WCF dan de klassieke manier van socket toepassen al voor je netjes afhandeld. Door die extra tags om je klasses en functies te zetten kun je heel wat instellen in je code en is meteen door .NET voor je geregeld. :)

Daar kom ik vervolgens op een tweede punt. Als ik mijn WCF service nou in een Windows Service applicatie host, blijft ie vanzelf draaien wanneer host.Open() wordt aangeroepen? Is hierbij de optie Keep-Alive al meteen toegepast of moet ik hierover ook iets bedenken/vinden?

Verwijderd

"Because the service instance remains in memory throughout the session, it can maintain state in memory, and the programming model is very much like that of the classic client-server model."

Lijkt me wel dus... :)

'k Heb wel 's per-call webservices geschreven met eigen state/session management en persistency, o.a. een webreserveringen systeem voor hotels waar nu nog tientallen hotels mee draaien (o.a. het hotel van een pretpark in Kaatsheuvel), maar dat was in Delphi 6. Werkt technisch heel aardig, maar schaalt niet geweldig en dan loop je gauw tegen performance problemen op...

M'n .NET webservices zijn stateless per-call services, en dan laat je het bijhouden van de state en het persisten volledig aan de client over (op de Amazon-manier). Doet 't prima, maar 't is een pain in the @ss om web developers die tegen die service aan moeten schrijven in te peperen dat zij de al opgehaalde gegevens moeten bijhouden.

Per-session lijkt me dan een stuk handiger, zeker als 't ook nog 's goed schaalbaar te krijgen is (100 concurrent sessies is in de praktijk eigenlijk niks). Ik ga me maar weer 's inlezen, dus jij bedankt voor de eye opener. :)

[ Voor 68% gewijzigd door Verwijderd op 24-10-2007 22:41 ]


Verwijderd

Topicstarter
Verwijderd schreef op woensdag 24 oktober 2007 @ 22:19:
Per-session lijkt me dan een stuk handiger, zeker als 't ook nog 's goed schaalbaar te krijgen is (100 concurrent sessies is in de praktijk eigenlijk niks). Ik ga me maar weer 's inlezen, dus jij bedankt voor de eye opener. :)
Ja, lijkt mij ook ;) en geen dank. Jij bent tenslotte de gene die mij heeft geholpen :P Ik ga de boel hier vandaag omzetten naar Windows Services :) Ben benieuwd of zo alles werkt zoals het hoort.

Weet je nog of mijn services dan ook blijven draaien. Hoe zit het met de keep-alive status van de WCF service?

  • Serpie
  • Registratie: Maart 2005
  • Laatst online: 01-07-2023
Verwijderd schreef op donderdag 25 oktober 2007 @ 11:13:
Weet je nog of mijn services dan ook blijven draaien. Hoe zit het met de keep-alive status van de WCF service?
Je kan in je configuratiebestanden een timeout opgeven maar ze blijven niet eeuwig de session behouden, tevens is het niet handig om hem heel hoog in te stellen omdat de client dan pas laat merkt dat je service eruit licht.

Voor mijn eigen programma stuur ik alsnog om de 30 seconden een berichtje naar de service toe, dat is genoeg om hem alive te houden.


Edit:
als ReliableSession.enabled op true staat zou de verbinding dus alive gehouden moeten worden door WCF.
http://wcf.netfx3.com/con...municationFoundation.aspx

Dit werkt echter niet door een bug, en zal in de volgende versie worden opgelost, je kan er dus omheen door zelf een keepalive in te bouwen of de timeout erg hoog in te stellen:
http://blogs.conchango.co...able-Sessions-Puzzle.aspx

[ Voor 36% gewijzigd door Serpie op 25-10-2007 18:17 ]


Verwijderd

Topicstarter
Serpie schreef op donderdag 25 oktober 2007 @ 18:04:
[...]


Je kan in je configuratiebestanden een timeout opgeven maar ze blijven niet eeuwig de session behouden, tevens is het niet handig om hem heel hoog in te stellen omdat de client dan pas laat merkt dat je service eruit licht.

Voor mijn eigen programma stuur ik alsnog om de 30 seconden een berichtje naar de service toe, dat is genoeg om hem alive te houden.

edit:

Hmm, nog even gezocht maar als ReliableSession.enabled op true staat zou de verbinding dus alive gehouden moeten worden door WCF.

http://wcf.netfx3.com/con...municationFoundation.aspx

verder nog niet getest en zelf dus met bovenstaande oplossing opgelost.
Ja, ik bedoel niet de sessies, maar de service zelf. Als ik host.OPEN() doe blijft die dan hangen wachten op requests. Voor elke sessie kan ik wel een timeout geven, dat weet ik... dat is ook geen probleem... Alleen vraag ik me af hoe dat zit met de service host zelf als die in een Windows Service applicatie gehost wordt. Regelt de Windows Service dat de WCF service verder blijft draaien en wachten op berichten nadat ik de host.open() functie heb aangeroepen?

  • Serpie
  • Registratie: Maart 2005
  • Laatst online: 01-07-2023
Verwijderd schreef op donderdag 25 oktober 2007 @ 18:17:
[...]


Ja, ik bedoel niet de sessies, maar de service zelf. Als ik host.OPEN() doe blijft die dan hangen wachten op requests. Voor elke sessie kan ik wel een timeout geven, dat weet ik... dat is ook geen probleem... Alleen vraag ik me af hoe dat zit met de service host zelf als die in een Windows Service applicatie gehost wordt. Regelt de Windows Service dat de WCF service verder blijft draaien en wachten op berichten nadat ik de host.open() functie heb aangeroepen?
Ja als jij op de host (windows service) je open functie aanroept zal deze open blijven staan, hier hoef je verder niets voor te doen. Of dit nu in een applicatie of windows service draait maakt verder niet uit.

Ik houd wel de hosts in variabelen vast in de server applicatie, om ze te kunnen herstarten etc.

[ Voor 4% gewijzigd door Serpie op 25-10-2007 18:27 ]


Verwijderd

Topicstarter
Serpie schreef op donderdag 25 oktober 2007 @ 18:21:
[...]
Ja als jij op de host (windows service) je open functie aanroept zal deze open blijven staan, hier hoef je verder niets voor te doen. Of dit nu in een applicatie of windows service draait maakt verder niet uit.

Ik houd wel de hosts in variabelen vast in de server applicatie, om ze te kunnen herstarten etc.
Ok, ik zal dat uitproberen... Ben je ook bekend met authenticatie bij WCF? Zo ja wil je dan ook het volgende topic bekijken?

[WCF .NET 3.0] Authentication without certificates

  • Serpie
  • Registratie: Maart 2005
  • Laatst online: 01-07-2023
Verwijderd schreef op donderdag 25 oktober 2007 @ 18:42:
[...]


Ok, ik zal dat uitproberen... Ben je ook bekend met authenticatie bij WCF? Zo ja wil je dan ook het volgende topic bekijken?

[WCF .NET 3.0] Authentication without certificates
Nee sorry op dit moment nog niets mee gedaan, dus kan er nog weinig over zeggen. Zit er niet iets bij de samples van WCF waar je wat aan hebt? (http://msdn2.microsoft.com/en-us/library/ms751514.aspx)

Verwijderd

Topicstarter
Als ik BasicHttpBinding gebruik is er een host open timeout of niet? Als ik nou de WCF service die gebruik maakt van BasicHttpBinding wil hosten in een Windows Service applicatie, vraag ik me dan af of de service dan wel blijft draaien na de timeout. Is er een soort optie om de binding element te zeggen dat die nooit moet stoppen met draaien en dat ie dus altijd moet luisteren naar aanvragen van de clients?

Stel je voor dat dit mijn OnStart functie is in mijn Windows Service: (pseudo)
Visual Basic:
1
2
3
4
5
6
Sub OnStart()
[...]
Dim host As New ServiceHost(...)
[...]
host.Open()
End Sub


Gaat ie niet meteen uit? Blijft ie dan draaien? Hoe lang?
Pagina: 1