【问题标题】:Issue running ASPX page using Scheduled Task使用计划任务运行 ASPX 页面问题
【发布时间】:2012-10-13 19:18:33
【问题描述】:

我有一个计划任务设置为在 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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    1. Windows Service Applications intro on MSDN:有更多链接:
    2. 如何:创建 Windows 服务
    3. 如何:安装和卸载服务
    4. 如何:启动服务
    5. 如何:调试 Windows 服务应用程序]
    6. 演练:创建 Windows 服务 组件设计器中的应用
    7. 如何:将安装程序添加到您的服务应用程序

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

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

    您的代码是用“try catch”编写的,它会隐藏错误。如果您不打算对捕获的错误做一些有用的事情,那么不要捕获它。在代码中处理您的边缘情况,而不是尝试捕获。 See this try-catch question on this site.

    【讨论】:

    • 感谢您提供的所有信息。我会尝试你的建议。不幸的是,我现在支持这个我没有设置的现有设计。如果时间允许,我将考虑使用 Windows 服务来实现这一点。我同意,这看起来确实更强大。
    • 我添加了日志记录并注意到问题不在数据库部分,而是在文本文件的实际读取中。请用代码查看我更新的问题。
    猜你喜欢
    • 2011-03-29
    • 2012-02-12
    • 1970-01-01
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    相关资源
    最近更新 更多