Ik ben bezig met een applicatie die af en toe communiceert met een server. Het gaat om een C#/WPF applicatie die communiceert met een ASP.NET Core web api (straks draaiend op Debian, waarschijnlijk, nu nog op localhost).
99% van de communicatie met de server is zodat de gebruiker kan inloggen op zijn account en zijn licenses kan ophalen, waarmee hij bepaalde delen van de client applicatie ontgrendelt.
In principe is het dus genoeg dat de client bij het opstarten een api/account/login aanroept en daarna een api/licenses/get aanroept of iets dergelijks.
Voor logging en om 'fraude' (delen van accounts/licenses) te voorkomen wil ik graag de sessies van gebruikers bijhouden. Zodra ze inloggen krijgen ze een sessie (gewoon een record in de database). In principe wil ik per gebruiker maar een sessie tegelijk toestaan. Momenteel stuurt de client een "close_session" berichtje als hij afsluit waarmee de sessie gesloten wordt en er weer een nieuwe gemaakt mag worden.
In de praktijk werkt dit echter natuurlijk niet; de applicatie zou kunnen crashen zonder de sessie te eindigen, de internet connectie zou tijdelijk weg kunnen zijn, de server zou tijdelijk down of net in maintenance kunnen zijn, etc.
Het idee is nu om een soort van 'heartbeat' te gebruiken om te bepalen hoe lang de gebruiker verbonden is. In principe zou de client dan bijvoorbeeld elke minuut even de server benaderen, en de tijd van die heartbeat wordt in de sessie opgeslagen. Bij het verzoek voor een nieuwe sessie kan ik dan kijken of de huidige sessie nog bezig is (minder dan een minuut geleden gebruikt) of verlopen is (meer dan een minuut geleden verbruikt en door toeval niet gesloten).
Hoewel ik dit allemaal wel ingebouwd krijg vraag ik me af of er geen nadelen aan verbonden zijn. Ik ben lang geen expert in ASP.NET maar ik weet wel dat het in principe gebruikelijk is dat een website of api zichzelf "afsluit" als hij niet in gebruik is, en weer opstart wanneer nodig. Als er nu tig users continu elke minuut een heartbeat lopen sturen zal de server daar dus nooit de kans voor krijgen. Ik kan me voorstellen dat dit (misschien op lange termijn) niet de bedoeling is?
Is er een betere oplossing? Of is dit helemaal geen probleem en werkt mijn idee prima?
99% van de communicatie met de server is zodat de gebruiker kan inloggen op zijn account en zijn licenses kan ophalen, waarmee hij bepaalde delen van de client applicatie ontgrendelt.
In principe is het dus genoeg dat de client bij het opstarten een api/account/login aanroept en daarna een api/licenses/get aanroept of iets dergelijks.
Voor logging en om 'fraude' (delen van accounts/licenses) te voorkomen wil ik graag de sessies van gebruikers bijhouden. Zodra ze inloggen krijgen ze een sessie (gewoon een record in de database). In principe wil ik per gebruiker maar een sessie tegelijk toestaan. Momenteel stuurt de client een "close_session" berichtje als hij afsluit waarmee de sessie gesloten wordt en er weer een nieuwe gemaakt mag worden.
In de praktijk werkt dit echter natuurlijk niet; de applicatie zou kunnen crashen zonder de sessie te eindigen, de internet connectie zou tijdelijk weg kunnen zijn, de server zou tijdelijk down of net in maintenance kunnen zijn, etc.
Het idee is nu om een soort van 'heartbeat' te gebruiken om te bepalen hoe lang de gebruiker verbonden is. In principe zou de client dan bijvoorbeeld elke minuut even de server benaderen, en de tijd van die heartbeat wordt in de sessie opgeslagen. Bij het verzoek voor een nieuwe sessie kan ik dan kijken of de huidige sessie nog bezig is (minder dan een minuut geleden gebruikt) of verlopen is (meer dan een minuut geleden verbruikt en door toeval niet gesloten).
Hoewel ik dit allemaal wel ingebouwd krijg vraag ik me af of er geen nadelen aan verbonden zijn. Ik ben lang geen expert in ASP.NET maar ik weet wel dat het in principe gebruikelijk is dat een website of api zichzelf "afsluit" als hij niet in gebruik is, en weer opstart wanneer nodig. Als er nu tig users continu elke minuut een heartbeat lopen sturen zal de server daar dus nooit de kans voor krijgen. Ik kan me voorstellen dat dit (misschien op lange termijn) niet de bedoeling is?
Is er een betere oplossing? Of is dit helemaal geen probleem en werkt mijn idee prima?