Hintergrund Arbeiten

16/11/2009 - 20:39 von Frederic Luchting | Report spam
Hallo ihr,

ich habe eine Webanwendung, die bei mehreren Kunden
im Einsatz ist. Meine Verantwortung liegt eigentlich
bei der Datenbank und dem Code dahinter (DAL, BL).

Die Oberflàche (aspx, ascx, resx, css usw) kann
dann jeder selber angepassen :-)

Jetzt soll aber auch immer mehr 'Verhalten' anpassbar
sein. Deshalb habe ich eine eigne Klasse von HttpApplication
abgeleitet und die Global.asax von dieser.

In meiner Klasse biete ich dann alle möglichen Events
an, die aus der Mittelschicht gefeuert werden und von
einem eigenen Modul behandelt werden können (das kann
jeder Kunde beliebig selber schreiben und in seiner
Web.config Datei einbinden).

Meine erste Frage ist also, ob das prinzipiell richtig
ist, da es für mich noch etwas 'magic' làuft. Aber
es scheint 100% erwartungsgemàß zu klappen.

Meine zweite Frage ist ein Problem: Es soll eine Möglichkeit
geschaffen werden, die in regelmàßigen Zeitabstànden angestoßen
wird. Also nicht bei jedem Request sondern alle x Minuten oder
zu jeder x-ten Stunde.

Dafür habe ich meiner Klasse einen Timer spendiert
(ich habe static und member Variable probiert und eine
singleton Klasse, die einen Timer beinhaltet), der
regelmàßig auch ein Ereignis auslösen soll. Das kommt auch
an - aber manchmal 2, 3 oder noch mehrere Male. (Wahrscheinlich
wenn mehrere Workerprocess Threads arbeiten).
Wie bekomme ich einen einheitlichen Hintergrundtakt?

Eine Lösung als Windowsdienst möchte ich nicht, da es
wahrscheinlich bei manchen nicht installiert werden kann.
Falls es für mehr als x-Minuten keinen Request gibt und
die Anwendung beendet wird, ist das OK - wenn sie beim
nàchsten Start wieder beginnt.

Habt ihr Ideen?

Viele Grüße

Frederic
.

Kurz der prinzipielle Code für 'Vor einer User-Registrierung'
(dort soll geblockt werden können, danach soll eine Mail verschickt
werden - klappt :-) - Mein Problem ist aber dann der TimerTick:

MyApplication.cs

public class MyApplication : HttpApplication
{
public event UserRegisterEventHandler UserRegistering;
public event UserRegisterEventHandler UserRegistered;
public event DoSomethingEventHandler TimerTick;

public delegate void UserRegisterEventHandler (
object sender,
UserRegisterEventArgs e);

public void OnUserRegistering(
object sender,
UserRegisterEventArgs e)
{
if (UserRegistering != null) UserRegistering(sender, e);
}
}

public class UserRegisterEventArgs : EventArgs
{
public bool Cancel {get; set;}
public string Email {get; set;}
}

Global.asax
-
public class Global : MyApplication
{
}

Mittelschicht Code.cs
public static RegisterPlayer(.. ganz viele felder )
{
HttpContext ctx = HttpContext.Current;
UserRegisterEventArgs urea = new UserRegisterEventArgs();
urea.Email = email; // <- aus den Parametern vom GUI
MyApplication ma = HttpContext.Current as MyApplication;
ma.OnUserRegistering(ctx, urea);

// do the INSERT in the database

ma.OnUserRegistered(ctx, urea) // <- zum E-Mail verschicken
}

CustomModule.dll
-
class MainInit : IHttpModule
{
public void Dispose() {}
public void Init(HttpApplication context)
{
MyApplication ma = context as MyApplication;
ma.UserRegistering += UserRegistering;
ma.UserRegistered += UserRegistered;
ma.TimerTick += TimerTick;
}
}

static void UserRegistering(object sender, UserRegisterEventArgs e)
{
if(e.Email.Contains("trashmail")) e.Cancel = true;
}

static void UserRegistered(object sender, UserRegisterEventArgs e)
{
// E-Mail verschicken klappt;
}

static void TimerTick(object sender, EventArgs e)
{
// Das wird mehrmals aufgerufen :-(
// =}
 

Lesen sie die antworten

#1 Thomas Bandt
17/11/2009 - 11:36 | Warnen spam
Hallo Frederic,

Frederic Luchting wrote:
Meine erste Frage ist also, ob das prinzipiell richtig
ist, da es für mich noch etwas 'magic' làuft. Aber
es scheint 100% erwartungsgemàß zu klappen.



schwierig zu beurteilen, der Ansatz erscheint mir nicht so
blöd zu sein, auch wenn du damit die Schichtentrennung
ziemlich aufweichst (Geschàftslogik sollte keine GUI-
Sachen konsumieren).

Eine Lösung als Windowsdienst möchte ich nicht, da es
wahrscheinlich bei manchen nicht installiert werden kann.
Falls es für mehr als x-Minuten keinen Request gibt und
die Anwendung beendet wird, ist das OK - wenn sie beim
nàchsten Start wieder beginnt.

Habt ihr Ideen?



Lösungsansàtze gibt es dazu ja viele im Netz (z.B.
http://tinyurl.com/yl4fura) - aber ich halte persönlich nichts davon,
unendlich laufende Threads im GUI und damit ASP.NET zu realisieren, weil
sie einfach unnötige Ressourcen blocken.

Und Windows-Dienste sind ja genau dafür da - und sowohl einfach zu
installieren als auch zu entwickeln. Ich würde also sagen: wer die
Funktionalitàt benötigt, was ja augenscheinlich nicht alle Szenarien bei
dir betrifft, sollte auch dafür sorgen können, dass der Dienst im
Hintergrund làuft.

Gruß, Thomas [MVP ASP/ASP.NET]
http://www.69grad.de

Ähnliche fragen