Hej 1. Kontrollera att det verkligen är timern som rensar efter dom där 10 minuterna Ett tips: Skapa inte en timer per användare då en timer i sin tur skapar en egen tråd. Och asp.net har då en tråd mindre att använda. Tänk dig sedan att 20 användare loggar in under en timme. 20 trådar som ingen använder, däremot får asp.net färre antal trådar att använda Tack för tipsen, har dock hittat en möjlig orsak, hade ställt in att "recycla" Application Pool var 20 minut. Stängde av det och problemet uppstår inte lika ofta men upplever fortfarande problemet. Har du sett WSE (Web Service Enhancements) som är tillägg till .NET Framework och som implementerar WS-Security standarden där bland annat den här funktionaliteten finns implementerad!Inloggninssystem
Bygger ett egen inloggningsystem för webservice som går ut på att först anges användarnamn och lösenord, stämmer dessa får man tillbaka en Ticket som gäller en viss tid och som används vid vidare förfrågningar.
Har följande klasser:
<code>
public class Ticket
{
public string key;
public Account account;
public DateTime expires;
}
internal sealed class TicketCollection: DictionaryBase
{
private System.Timers.Timer timer;
internal void Add(Ticket ticket)
{
this.Dictionary.Add(ticket.Key, ticket);
}
internal void Remove(Ticket ticket)
{
this.Dictionary.Remove(ticket.Key);
}
internal void Remove(string key)
{
this.Dictionary.Remove(key);
}
internal Ticket this[string key]
{
get { return (Ticket)this.Dictionary[key]; }
}
internal ICollection Values
{
get { return this.Dictionary.Values; }
}
internal bool Contains(string key)
{
return base.Dictionary.Contains(key);
}
private void Clean(object sender, ElapsedEventArgs e)
{
DateTime datetime = DateTime.Now;
StringCollection remove = new StringCollection();
lock(this.Dictionary.SyncRoot)
{
foreach(Ticket ticket in this.Dictionary.Values)
if (ticket.Expires < datetime) remove.Add(ticket.Key);
foreach(string key in remove)
this.Remove(key);
}
}
internal TicketCollection()
{
timer = new Timer(600000);
timer.Elapsed += new ElapsedEventHandler(Clean);
timer.Start();
}
}
public class TicketManager
{
private static TicketCollection tickets = new TicketCollection();
public bool Validate(string key);
public static Ticket Issue(Account account);
// etc...
}
</code>
Allt verkade fungera till en början tills jag upptäckte att man ibland loggades ut utan orsak, t.ex bara 10 minuter efter påloggning (expires är satt till 60 min just nu). Det borde inte heller ha varit på grund av att applikationer startade om, då den användes hela tiden fram tills man loggades ur.
Har funderat på om det kan ha något att göra med om klassen är thread-safe eller liknande? Har även funderat om det kan vara något problem med timern som rensar bort objekt som inte används?
Förslag på vad som kan vara tokigt eller förbättringar mottages tacksamt.Sv: Inloggninssystem
2. Använd "lock" vid add / remove också
3. Jag har haft erfarenhet av att Timern ibland får spel när den kör i en server-app. Testa att använda en tråd istället som väntar Sv:Inloggninssystem
Sv:Inloggninssystem
Ska testa med en tråd i stället.Sv: Inloggninssystem
http://msdn.microsoft.com/webservices/
Mvh
Johan Lindfors