Asp.net 使用计划任务运行ASPX页时出现问题

Asp.net 使用计划任务运行ASPX页时出现问题,asp.net,iis,internet-explorer-7,scheduled-tasks,webforms,Asp.net,Iis,Internet Explorer 7,Scheduled Tasks,Webforms,我有一个计划任务,在IE7中每3分钟运行一次Scan.aspx。Scan.aspx按顺序从10个文件中读取数据。这些文件不断更新。文件中的值将插入到数据库中 偶尔,正在读取的值会被截断或扭曲。例如,如果文件中的值为“Hello World”,则数据库中将出现诸如“Hello W”、“Hel”等随机条目。这些条目上的时间戳看起来完全是随机的。有时在凌晨1:00,有时在凌晨3:30。有些晚上,这根本不会发生 调试代码时,我无法重现此问题。因此,我知道在“正常”情况下,代码执行正确 更新: 以下是用于

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

偶尔,正在读取的值会被截断或扭曲。例如,如果文件中的值为“Hello World”,则数据库中将出现诸如“Hello W”、“Hel”等随机条目。这些条目上的时间戳看起来完全是随机的。有时在凌晨1:00,有时在凌晨3:30。有些晚上,这根本不会发生

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

更新:

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


您知道为什么在一天中多次运行(通过计划任务)时会出现问题吗?

首先在ASP.NET解决方案中安装Log4Net之类的记录器,在Scan.aspx中记录方法入口和出口点,以及更新数据库的方法。这有可能为正在发生的事情提供一些线索。您还应该检查系统事件日志,查看是否有任何其他事件与失败的DB条目相关

对于这种情况,ASP.NET不是最好的选择,尤其是与Windows计划的任务配对时;这不是一个稳健的设计。更健壮的系统将在Windows服务应用程序中的计时器上运行。您用于读取文件和更新数据库的代码可以跨多个端口进行移植。如果您有权访问服务器并可以安装Windows服务,请确保也将日志添加到Windows服务

确保您阅读了下面的调试方法

  • :有以下链接:
  • 如何:创建Windows服务
  • 如何:安装和卸载服务
  • 如何:启动服务
  • 如何:调试Windows服务应用程序]
  • 演练:创建Windows服务 组件设计器中的应用
  • 如何:将安装程序添加到服务应用程序
  • 关于您对凌晨1点和凌晨3点30分出现的明显随机条目的后续评论:您应该:

  • 发生这些情况时,请调查站点的IIS日志,并找出当时是什么击中(访问)了页面
  • 检查访问您的aspx页面的服务器上是否有索引服务
  • 检查是否安装了防病毒软件,并确定这是否正在访问您的aspx页面或影响Asp.Net缓存;这可能会导致编译问题,例如aspnet缓存中aspnet页面上的文件锁定;(aspnet网站与aspnet web应用程序相反的场景)可能会出现奇怪的行为
  • 找出被截断的条目是否与文件更新的时间一致:将db条目时间戳或记录器时间戳与文件更新的时间交叉引用
  • 更新日志记录程序以记录正在读取的文件的全部内容,以验证您没有出现“垃圾输入>垃圾输出”的情况。运行一个晚上,要小心服务器上的磁盘空间
  • 找出运行web应用程序的应用程序池何时被回收,并将其与截断条目的时间交叉引用;只能通过ASP.NET运行状况监视使用web.config执行此操作
  • 您的代码是用“try-catch”编写的,它将隐藏错误。如果您不打算对捕获到的错误做一些有用的事情,那么就不要捕获它。在代码中处理边缘情况,而不是尝试捕获。
    .

    谢谢您提供的所有信息。我会试试你的建议。不幸的是,我现在支持这个我没有设置的现有设计。如果时间允许,我将研究用Windows服务实现这一点。我同意,这看起来更可靠。我添加了日志记录,并注意到问题不在数据库部分,而是在文本文件的实际读取中。请查看我的更新问题和代码。
    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