【问题标题】:ASP.NET auto-executing pageASP.NET 自动执行页面
【发布时间】:2010-09-22 10:55:24
【问题描述】:

长期以来,我一直在玩弄某种自动清理页面的想法,该页面执行例行维护任务,并通过调用 asp.net 页面的 1x1 像素 gif 来超出当前页面执行范围src 参数。然而,我从来没有真正决定过的一件事是如何处理这样一个页面的执行时间,以便它不会在每个请求中执行,也许就像……每 5 个请求。或每 30 分钟或其他间隔。

您会如何考虑建立这样的机制?

【问题讨论】:

  • 您心目中的清理和维护任务是 ASP.NET 特有的吗?您是否受到如何安排这些任务的限制,这导致您考虑使用由浏览器请求触发的技术?可以应用代码自行清理吗?
  • 我所说的代码清理类型是在会话期间存储文件或数据并放弃会话。我运行一个为多个应用程序提供服务的网络场,并且 session_end 事件在此环境中不可靠。

标签: c# asp.net


【解决方案1】:

这种情况我遇到过很多次,我一般都是用任务调度器来调用页面,这样它是一致的和可靠的。依赖页面被调用的问题是你必须确保你的页面总是会有请求。如果你能保证这一点,那么只需在应用程序级别存储一个变量,其中包含上次运行任务的时间戳,并让每个页面检查该时间戳,并在收到超过特定阈值的请求时更新它。

【讨论】:

  • 这绝对是最可靠最简单的选择。
  • 这是我最近使用的解决方案 - 一个在页面上运行 wget 的简单 Windows 计划任务。很高兴知道这对其他人也有意义。
【解决方案2】:

听起来您可能想改用 global.asax 文件 - 假设您希望每 N 次发生一次。例如,如果您想为网站的每 5 个访问者做一些事情,您可以按照以下方式做一些事情,

void Application_Start(object sender, EventArgs e) 
{
    // Code that runs on application startup
    Application["Sessions"] = 0;
}

void Session_Start(object sender, EventArgs e) 
{
   // Code that runs when a new session is started
   Application.Lock();
   Application["Sessions"] = (int)Application["Sessions"] + 1;

   if ((int)Application["Sessions"] % 5 == 0)
   {
     DoSomething();
     Application["Sessions"] = 0;
    }
    Application.UnLock();
}

我强烈推荐这些方面的东西,而不是将脚本附加到 GIF 文件的源代码。您拥有更多的控制权和安全性。

【讨论】:

  • 您还可以在 Application_Start 中启动一个后台线程,该线程会休眠并执行您想要的任务。但是,如果没有人访问,它最终会随着应用程序池被杀死而停止。解决这个问题的唯一方法是安排任务。
  • 如果应用程序没有运行,很可能您的后台进程也不需要运行。
【解决方案3】:

您是否考虑过改用 Windows 服务?运行清理任务会占用 ASP.NET 线程池中的一个线程。或者,如果您正在清理 SQL Server 数据库,那么 SQL Server 代理作业可能会更好。

【讨论】:

  • 如果只是 SQL 清理,一个 SQL 作业就完美了,但它通常涉及文件系统相关的任务,例如清理废弃的用户上传等。
【解决方案4】:

stackoverflow 博客中的相关条目:https://blog.stackoverflow.com/2008/07/easy-background-tasks-in-aspnet/

其他:

请注意,如果您缺乏稳定、一致的流量,一些解决方案将不起作用。如果 IIS 卸载您的应用程序,缓存、会话和请求方法不起作用。

如果可能,请为每个服务安装一个 Windows 任务服务。制定一个动态添加/删除任务的方案。

如果您的应用是托管的,而您无法安装服务,请考虑使用站点监视器来访问它 - 例如 siteuptime。这将您的应用程序保留在内存中,允许您点击处理程序或操作页面而不是虚拟图像,并让您准确决定它何时运行。

【讨论】:

  • 我绝对讨厌为此目的开发 Windows 服务。我们的大多数项目都是围绕支持产品发布或活动而构建的短期站点,我讨厌将服务器与支持 10-20 个网站的服务混为一谈的想法。我同意这是最好的方法,但不是我喜欢的方法。
  • 我理解对许多服务的厌恶。考虑为每台服务器提供一项服务,其中包含可配置的任务或动态加载的任务程序集。
【解决方案5】:

我会设置一个计时器并在计时器触发时运行清理任务。如果您想根据请求数进行清理,您可以缩短计时器间隔,然后在计时器触发时检查请求计数;如果请求计数太低,则跳过清理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-08
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多