使用计划任务运行ASPX页面

时间:2012-10-23 19:15:00

标签: asp.net iis internet-explorer-7 scheduled-tasks webforms

我有一个计划任务设置为在IE7中每3分钟运行一次Scan.aspx。 Scan.aspx按顺序从10个文件中读取数据。这些文件不断更新。文件中的值将插入数据库中。

偶尔,读取的值会被截断或失真。例如,如果文件中的值为“Hello World”,则数据库中将包含“Hello W”,“Hel”等随机条目。这些条目的时间戳显示为完全随机。有时在凌晨1点,有时在凌晨3:30。有些夜晚,这根本不会发生。

调试代码时,我无法重现此问题。所以我知道在“normal”情况下,代码正确执行。

更新

这是用于读取文本文件的aspx codebehind(在Page_Load中)(这是为10个文本文件中的每一个调用的):

Dim filename As String = location
   If File.Exists(filename) Then
        Using MyParser As New FileIO.TextFieldParser(filename)
            MyParser.TextFieldType = FileIO.FieldType.Delimited
            MyParser.SetDelimiters("~")
            Dim currentrow As String()
            Dim valueA, valueB As String

            While Not MyParser.EndOfData
                Try
                    currentrow = MyParser.ReadFields()
                    valueA= currentrow(0).ToUpper
                    valueB = currentrow(1).ToUpper
                    //insert values as record into DB if does not exist already
                Catch ex As Exception
                End Try
            End While
        End Using
    End If

为什么在全天多次运行(通过预定任务)时可能会导致问题的任何想法?

1 个答案:

答案 0 :(得分:3)

首先在ASP.NET解决方案中实现Log4Net等Logger,在Scan.aspx中实现Log方法的入口和出口点,以及更新数据库的方法。这可能会提供一些正在发生的事情的暗示。您还应该检查系统事件日志,以查看是否有任何其他事件与失败的数据库条目相关联。

ASP.NET不是这种情况的最佳选择,尤其是在与Windows计划任务配对时;这不是一个强大的设计。一个更强大的系统将运行在Windows服务应用程序内的计时器上。您可以移植用于读取文件和更新到DB的代码。如果您可以访问服务器并且可以安装Windows服务,请确保您也将日志记录添加到Windows服务中!

请务必阅读下面的“如何调试”

  1. Windows Service Applications intro on MSDN:还有以下链接:
  2. 如何:创建Windows服务
  3. 如何:安装和卸载服务
  4. 如何:启动服务
  5. 如何:调试Windows服务应用程序]
  6. 演练:创建Windows服务 应用程序在组件设计器中
  7. 如何:向服务应用程序添加安装程序
  8. 关于有时出现在凌晨1点和凌晨3点30分的明显随机条目的后续评论:您应该:

    1. 在发生这些事件时调查网站的IIS日志,并找出当时点击(访问过)网页的内容。
    2. 检查服务器上是否有访问您的aspx页面的索引服务。
    3. 检查是否安装了防病毒软件,并确定是否正在访问您的aspx页面或影响Asp.Net缓存;这可能导致编译问题,例如aspnet缓存中aspnet页面上的文件锁; (aspnet网站与aspnet网络应用程序相对的情景)可能会产生奇怪的行为。
    4. 查明截断的条目是否与文件更新时间一致:交叉引用数据库条目时间戳或记录器时间戳与文件更新时间。
    5. 更新您的记录器以记录正在阅读的文件的全部内容,以确认您没有“垃圾邮件”>垃圾场景。通过运行一晚来小心服务器上的磁盘空间。
    6. 找出您的网络应用运行的应用程序池何时被回收,并将其与截断条目的时间交叉引用;您只能通过ASP.NET运行状况监控来使用web.config执行此操作。
    7. 你的代码是用'try catch'编写的,它会掩盖错误。如果您不打算对捕获的错误做一些有用的事情,那么就不要抓住它。在代码中处理边缘情况,而不是try catch。 See this try-catch question on this site