2

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

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

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

更新:

这是用于读取文本文件的 aspx 代码隐藏(在 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

任何想法为什么这可能会在一天中多次运行(通过计划任务)时导致问题?

4

1 回答 1

3

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

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

确保您阅读了下面的如何调试

  1. MSDN 上的 Windows 服务应用程序介绍:具有以下链接:
  2. 如何:创建 Windows 服务
  3. 如何:安装和卸载服务
  4. 如何:启动服务
  5. 如何:调试 Windows 服务应用程序]
  6. 演练:在组件设计器中创建 Windows 服务应用程序
  7. 如何:将安装程序添加到您的服务应用程序

关于您对有时在凌晨 1 点和 3.30 点出现的明显随机条目的后续评论:您应该:

  1. 当这些发生时,调查站点的 IIS 日志,并找出当时访问(访问)页面的内容。
  2. 检查访问您的 aspx 页面的服务器上是否有索引服务。
  3. 检查是否安装了防病毒软件并确定这是否正在访问您的 asp 页面或影响 Asp.Net 缓存;这可能会导致编译问题,例如 aspnet 缓存中的 aspnet 页面上的文件锁定;(与 aspnet web 应用程序相反的 aspnet 网站场景)可能会产生奇怪的行为。
  4. 查明截断的条目是否与更新文件的时间一致:将您的数据库条目时间戳或记录器时间戳与文件更新时间交叉引用。
  5. 更新您的记录器以记录正在读取的文件的全部内容,以验证您没有遇到“垃圾输入 > 垃圾输出”的情况。运行一晚,小心服务器上的磁盘空间。
  6. 找出您的 Web 应用程序运行所在的 App-Pool 何时被回收,并将其与您截断条目的时间交叉引用;您只能通过 ASP.NET Health Monitoring 使用 web.config 执行此操作。

您的代码是用“try catch”编写的,它会掩埋错误。如果您不打算对捕获的错误做一些有用的事情,那么不要捕获它。在代码中处理您的边缘情况,而不是尝试捕获。 请参阅此站点上的这个 try-catch 问题

于 2012-10-23T20:33:49.743 回答