【问题标题】:Create a page that self executes in ASP.NET创建一个在 ASP.NET 中自行执行的页面
【发布时间】:2011-03-16 01:57:53
【问题描述】:

大家好,我正在尝试在我的网站上创建一个类似于网络爬虫的网络应用。我已经完成了几乎所有的代码来进行爬网,但我仍然需要亲自去网页激活代码。有什么方法可以让我的 ASP.NET 代码每天在服务器上自动执行一次? (如果这有什么不同,我正在使用 Godaddy)

谢谢

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    您不想要“页面”,您想要预定的控制台应用程序或 Windows 服务。根据设计,页面是可请求的服务器资源。 (查看 RESTful 设计。)它意味着由来自客户端的请求调用,可能执行一些服务器端逻辑,并向该客户端返回响应。故事结束。

    我想,您的网站可能会在应用程序启动时产生某种线程。不过,对我来说似乎有点骇人听闻。但是,如果这是您与托管服务提供商的唯一选择,那么这可能确实是您的选择。 (尽管您仍然必须至少调用一次页面才能启动它。)但是,理想情况下,您希望由站点本身之外的应用程序或 Windows 服务处理一个持续的进程。

    (如果您确实使用在应用程序启动时产生的线程,请注意可能导致应用程序重新启动的各种事情。一旦启动,这并不意味着它会一直运行。任何更改配置文件,更改某些项目类型中的页面或代码,IIS 想要释放资源并感觉像重新启动池等)

    【讨论】:

    • 所有内部 ASP.NET 方法肯定是“hackish”。您可以执行循环缓存回调或在 OnRequest 中触发但仅每天执行的操作(可能使用应用程序状态或缓存来存储上次执行时间戳以进行比较)。在单个服务器上两者都不是 100% 可靠的,更不用说可能以任何形式定期回收其应用程序池的服务器了。两者都不能很好地扩展到多台服务器(不知道 GoDaddy 默认托管的是什么)。
    • @patridge:没错。在分离关注点的世界中,这是一个需要与 Web 应用程序分离的关注点。
    【解决方案2】:

    最好的方法是不使用网页,而是创建一个具有满足您需要的方法的类,并从 global.asax 文件中的 Application_OnStart 事件调用它。然而,代码可能每天被访问不止一次。但是,如果您使用的是数据库,则可以保留一个配置值,以说明进程运行的最后一天。然后仅在当前日期不等于上次运行日期时运行。

    【讨论】:

    • 在调用第一页之前肯定 Application_OnStartup 不会运行?
    • @Chris Simpson 在发出请求并启动应用程序之前它不会运行。这可能会导致第一个访客的延迟。这听起来也像是一个例程,可以很好地放入一个线程中,然后启动它,让它随时完成。然后用户仍然可以使用该站点,并且爬虫检索到的新信息最终将可用。根据网站获得的流量,Application_OnStart 一天可能发生几次,因此需要加以调整。
    【解决方案3】:

    为您的目的计划执行网页并不理想,但是:

    如果您愿意随时打开浏览器,可以将其放在标题中:

    <script type="text/javascript">
    <!--    
      var timer = setInterval("autoRefresh()", 1000 * 60 * 1440);
      function autoRefresh(){self.location.reload(true);}
    //--> 
    </script>
    

    或者,您可以在 *nix 服务器上创建一个 cron 作业来每天调用您的页面:

    * 0 * * * /usr/local/bin/curl --silent --compressed http://www.domain.com/page
    

    【讨论】:

      猜你喜欢
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-11
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多