我设置了一个计划任务,在 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 解决方案中实现 Log4Net 等 Logger,并在 Scan.aspx 中实现 Log 方法入口和导出点以及更新数据库的方法。这有可能提供一些正在发生的事情的线索。您还应该检查系统事件日志,看看是否有任何其他事件与失败的数据库条目相关。
对于这种情况,ASP.NET 并不是最好的选择,尤其是与 Windows 计划任务配合使用时;这不是一个稳健的设计。更强大的系统将在 Windows 服务应用程序内的计时器上运行。您用于读取文件和更新数据库的代码可以移植。如果您有权访问服务器并且可以安装 Windows 服务,请确保您也将日志记录添加到 Windows 服务!
请务必阅读下面的如何调试
- Windows Service Applications intro on MSDN :有更多链接:
- 如何:创建 Windows 服务
- 如何:安装和卸载服务
- 如何:启动服务
- 如何:调试 Windows 服务应用程序]
- 演练:创建 Windows 服务 组件设计器中的应用
- 如何:将安装程序添加到您的服务应用程序
关于您对有时在凌晨 1 点和 3.30 点出现的明显随机条目的后续评论:您应该:
- 在发生这些情况时调查网站的 IIS 日志,并找出当时访问(访问)页面的内容。
- 检查访问您的 aspx 页面的服务器上是否有索引服务。
- 检查是否安装了防病毒软件,并确定该软件是否正在访问您的 aspx 页面或影响 Asp.Net 缓存;这可能会导致编译问题,例如 aspnet 缓存中的 aspnet 页面上的文件锁定; (针对 aspnet 网站而不是 aspnet Web 应用程序的场景)可能会产生奇怪的行为。
- 查明截断的条目是否与文件更新时间一致:将数据库条目时间戳或记录器时间戳与文件更新时间交叉引用。
- 更新您的记录器以记录正在读取的文件的全部内容,以验证您没有出现“垃圾输入 > 垃圾输出”情况。运行一晚,小心服务器上的磁盘空间。
- 查明您的网络应用程序运行所在的应用程序池何时被回收,并将其与截断条目的时间进行交叉引用;您只能通过 ASP.NET 运行状况监控使用 web.config 来执行此操作。
你的代码是用“try catch”编写的,它会隐藏错误。如果您不打算对捕获的错误做一些有用的事情,那么就不要捕获它。在代码中处理边缘情况,而不是 try catch。 See this try-catch question on this site .
关于asp.net - 使用计划任务运行 ASPX 页面时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13037550/