在托管的Web服务器上安排工作

问题描述:

有人能给我一个用.NET技术实现日常工作的最佳方式。 我有一个asp.net应用程序与sqlserver数据库托管在共享主机,GODaddy在我的实例。 我的应用程序用于添加/更改数据库中当前表现相当公平的数据。 我收到了一个新的要求,每天根据存储在数据库中的一些数据标准发送一些电子邮件警报。在托管的Web服务器上安排工作

最初我想写一个Windows服务,但是godaddy不允许访问除托管应用程序以外的数据库。 有人有任何想法每天凌晨1:00发送警报吗?

在此先感谢

参见Jeff Atwood的Easy Background Tasks in ASP.NET

复制/粘贴从链接:

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)); 
} 

我没有使用GoDaddy的比域名注册其他任何东西,所以我和你可以或不可以他们的主机平台上做的没有经验。我也不知道他们的支持或知识基础是什么样的,但我认为你最好的选择是向GoDaddy询问他们推荐的内容。否则,您可能会继续实施技术上可行的事情,但会被托管公司阻止。

如果它不是黄金时间的应用程序,快速而肮脏的做法是让某种外部机器人调用服务器上的(安全)网页来触发通知过程。这不是一个真正的解决方案,但是如果这个网站只是你的一个爱好,它可以让你找到主人允许的东西。

如果这个不符合您的要求,可能也是找到新主机的好时机。现在有很多好的ASP.NET主机可用。

您可以使用Web服务器中的Windows调度程序调度可以根据特定条件发送邮件的存储过程调用。

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

参考文献:

二者必选其一System.Timers,的System.Threading创建在预定时间运行一个实例。让该线程执行任何你想要的任务...确保代码是线程安全的!

+0

什么保证了应用程序域是在凌晨1:00运行?不会因为没有活动而被卸载? – 2009-07-16 00:08:07

+0

为什么要卸载线程?它在启动时初始化并在后台运行,直到检查是否有任何要执行的任务?如果你不明白,那么我对缺乏细节表示歉意 如果你注意到,我提出的建议基本上是他已经实施的 – 2009-07-17 02:48:50

许多托管服务提供商可以每X分钟为您请求一个URL。我不知道GoDaddy是否会这样做,但如果是这样,您可以创建一个ASMX页面来启动该作业,并告诉它们自动执行该页面。

如果他们不这样做,一个解决方案可能是在每个页面请求的后台线程中触发该作业。如果你这样做,请确保你输入的代码限制它运行每X分钟或更多(可能使用静态变量或数据库表) - 读取this story

如果您可以在承载应用程序和数据库认证服务 - 当然,您可以使用凭据远程访问该服务,然后下载数据并以这种方式发送邮件。

这可能是一个作为Windows服务编写的自动化过程,在计划程序下运行的应用程序或您在凌晨1:00推送的某个按钮。你的选择。

仅仅因为应用程序是唯一可以访问数据库并不意味着您不能以其他方式公开数据。