2009-07-15 9 views
4

Quelqu'un peut-il me donner un meilleur moyen de mettre en œuvre un travail quotidien avec la technologie .NET. J'ai une application asp.net avec la base de données sqlserver hébergée en hébergement partagé, GODaddy dans mon exemple. Mon application est utilisée pour ajouter/modifier les données dans la base de données qui fonctionne assez bien en ce moment. J'ai reçu une nouvelle exigence d'envoyer des alertes par courriel chaque jour en fonction de certains critères de données qui ont été stockés dans la base de données.Programmer un travail dans un serveur Web hébergé

Initialement, je pensais écrire un service Windows, mais Godaddy ne permet pas d'accéder à la base de données autre que ses applications hébergées. Quelqu'un a-t-il une idée pour envoyer des alertes tous les jours à 01h00?

Merci à l'avance

Répondre

5

Voir Easy Background Tasks in ASP.NET par Jeff Atwood.

Copier/coller à partir du lien:

private static CacheItemRemovedCallback OnCacheRemove = null; 

protected void Application_Start(object sender, EventArgs e) 
{ 
    AddTask("DoStuff", 60); 
} 

private void AddTask(string name, int seconds) 
{ 
    OnCacheRemove = new CacheItemRemovedCallback(CacheItemRemoved); 
    HttpRuntime.Cache.Insert(name, seconds, null, 
     DateTime.Now.AddSeconds(seconds), Cache.NoSlidingExpiration, 
     CacheItemPriority.NotRemovable, OnCacheRemove); 
} 

public void CacheItemRemoved(string k, object v, CacheItemRemovedReason r) 
{ 
    // do stuff here if it matches our taskname, like WebRequest 
    // re-add our task so it recurs 
    AddTask(k, Convert.ToInt32(v)); 
} 
+0

Merci pour votre réponse. Y at-il un gain de performance que je vais atteindre avec le morceau de code ci-dessus au lieu de protected void Application_Start (expéditeur d'objet, EventArgs e) { Thread invAlertThread = new Thread (newThreadStart (Alertes.SendAlerts)); invAlertThread.Name = "Alertes de facture"; invAlertThread.Start(); } où Alerts.SendAlerts est une méthode statique public class Alertes { SendAlerts public static() { // envoyer des alertes ici // 5 Heures Thread.sleep (18000000); SendAlerts(); } } – krishna

+0

@krishna Je ne pense pas que démarrer un nouveau thread à partir de Application_Start est une bonne idée. –

+0

Quelqu'un peut-il confirmer que cela fonctionne réellement sur l'environnement hôte partagé GoDaddy Windows? – Josh

0

Je n'ai pas utilisé GoDaddy pour autre chose que l'enregistrement de domaine, donc je n'ai aucune expérience avec ce que vous pouvez ou ne pouvez pas faire sur leur plate-forme d'hébergement. Je ne sais pas non plus quel est leur support ou leur base de connaissances, mais je dirais que votre meilleure option est de demander à GoDaddy ce qu'ils recommandent. Sinon, vous pouvez continuer à mettre en œuvre quelque chose qui est techniquement faisable, mais qui est bloqué par la société d'hébergement. Si ce n'est pas quelque chose qui est une application de prime time, une chose rapide et sale à faire est d'avoir une sorte de bot externe appelant une page web (sécurisée) sur le serveur qui déclenche le processus de notification. Ce n'est pas une vraie solution, mais si ce site n'est qu'un passe-temps, il pourrait vous aider jusqu'à ce que vous trouviez quelque chose que l'hôte vous permettra. Peut également être un bon moment pour trouver un nouvel hôte, si celui-ci ne répond pas à vos besoins. Il y a beaucoup de bons hôtes ASP.NET disponibles ces jours-ci.

0

Vous pouvez utiliser le planificateur Windows depuis le serveur Web pour planifier un appel de procédure stockée pouvant envoyer un courrier en fonction de critères particuliers.

osql.exe -S servername -d database -U username -P password -Q "EXEC spAlertOnCriteria" 

Références:

-1

utiliser soit System.Timers, System.Threading pour créer une instance qui est exécutée à un instant prédéterminé. Avoir ce thread exécuter quelle que soit la tâche que vous voulez ... Assurez-vous que le code est thread safe!

+0

Ce qui garantit que le appdomain fonctionne à 01h00? Ne serait-il pas déchargé pour aucune activité? –

+0

pourquoi le fil serait-il déchargé? Il est initialisé au démarrage et s'exécute en arrière-plan jusqu'à ce qu'il vérifie s'il existe des tâches à exécuter. Si vous n'avez pas compris .. alors je m'excuse pour le manque de détail Si vous remarquez, la suggestion que j'ai faite est fondamentalement ce qu'il a mis en œuvre –

0

De nombreux fournisseurs d'hébergement peuvent vous demander une URL toutes les X minutes. Je ne sais pas si GoDaddy le fait, mais si c'est le cas, vous pouvez créer une page ASMX qui démarre le travail et leur dire de l'exécuter automatiquement. Si ce n'est pas le cas, une solution pourrait être de déclencher le travail dans un thread d'arrière-plan à chaque demande de page. Si vous faites cela, assurez-vous de mettre dans le code qui limite à X minutes ou plus (en utilisant une variable statique ou une table de base de données) - lire this story

0

Si vous pouvez exposer un service sur le site Web hébergeant le application et base de données - service authentifié, bien sûr - alors vous pouvez frapper ce service à distance de n'importe quelle boîte avec des informations d'identification, déroulez les données, et envoyez le courrier de cette façon.

Il peut s'agir d'un processus automatisé écrit en tant que service Windows, d'une application exécutée sous le planificateur ou d'un bouton poussé à 1 heure du matin. Ton choix.

Ce n'est pas parce que l'application est la seule à pouvoir accéder à la base de données que vous ne pouvez pas exposer les données autrement.

Questions connexes