在托管Web服务器中安排作业

时间:2009-07-15 23:18:55

标签: c# asp.net web

有人可以给我一个使用.NET技术实现日常工作的最佳方法。 我有一个asp.net应用程序,其中sqlserver数据库托管在我的实例中的共享主机GODaddy中。 我的应用程序用于添加/更改数据库中的数据,此时数据表现相当公平。 我有一个新的要求,即每天根据存储在数据库中的一些数据标准发送一些电子邮件警报。

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

提前致谢

6 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

我没有将GoDaddy用于域名注册以外的任何其他内容,因此我对您在托管平台上可以做什么或不做什么都没有经验。我也不知道他们的支持或知识基础是什么样的,但我认为你最好的选择是向GoDaddy询问他们的建议。否则,您可能会继续实施技术上可行的东西,但被托管公司阻止。

如果它不是黄金时段的应用程序,那么快速而又脏的事情就是让某种外部机器人在服务器上调用(安全)网页来触发通知过程。这不是一个真正的解决方案,但如果这个网站只是你的一个爱好,它可能会让你到达,直到你找到主机允许的东西。

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

答案 2 :(得分:0)

您可以使用来自Web服务器的Windows计划程序来安排可以根据特定条件发送邮件的存储过程调用。

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

参考文献:

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

如果您可以在托管应用程序和数据库的网站上公开服务 - 当然是经过身份验证的服务 - 那么您可以从任何带有凭据的框中远程访问该服务,下拉数据并以这种方式发送邮件。

这可以是作为Windows服务编写的自动过程,在调度程序下运行的应用程序,或者在凌晨1:00推送的某个按钮。你的选择。

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

答案 5 :(得分:-1)

使用System.Timers,System.Threading创建在预定时间运行的实例。让该线程执行您想要的任何任务...确保代码是线程安全的!