2

IE7で3分ごとにScan.aspxを実行するようにスケジュールされたタスクを設定しています。Scan.aspxは、10個のファイルから順番にデータを読み取ります。これらのファイルは常に更新されています。ファイルの値がデータベースに挿入されます。

散発的に、読み取られる値は切り捨てられるか、歪められます。たとえば、ファイルの値が「Hello World」の場合、「Hello W」、「Hel」などのランダムなエントリがデータベースにあります。これらのエントリのタイムスタンプは完全にランダムに表示されます。午前1時の場合もあれば、午前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

(スケジュールされたタスクを介して)1日に複数回実行すると、これが問題を引き起こす可能性がある理由はありますか?

4

1 に答える 1

3

まず、ASP.NET ソリューションに Log4Net などのロガーを実装し、Scan.aspx にログ メソッドのエントリ ポイントとエグジット ポイント、および DB を更新するメソッドを実装します。これにより、何が起こっているかのヒントが得られる可能性があります。また、システム イベント ログをチェックして、失敗した DB エントリに関連する他のイベントがあるかどうかを確認する必要があります。

ASP.NET は、特に Windows のスケジュールされたタスクと組み合わせた場合、このシナリオには最適ではありません。これは堅牢な設計ではありません。より堅牢なシステムは、Windows サービス アプリケーション内のタイマーで実行されます。ファイルを読み取り、DB に更新するためのコードを移植できます。サーバーにアクセスでき、Windows サービスをインストールできる場合は、Windows サービスにもログを追加してください。

以下のデバッグ方法を必ずお読みください。

  1. MSDN の Windows Service Applications intro : 次へのリンクがあります。
  2. 方法: Windows サービスを作成する
  3. 方法: サービスをインストールおよびアンインストールする
  4. 方法: サービスを開始する
  5. 方法: Windows サービス アプリケーションをデバッグする]
  6. チュートリアル: コンポーネント デザイナーでの Windows サービス アプリケーションの作成
  7. 方法: サービス アプリケーションにインストーラーを追加する

午前 1 時と午前 3 時 30 分に時々発生する明らかなランダム エントリに関するフォローアップ コメントについては、次のことを行う必要があります。

  1. これらが発生したときにサイトの IIS ログを調査し、その時点で何がページにヒット (訪問) したかを調べます。
  2. aspx ページにアクセスしているサーバーにインデックス サービスがあるかどうかを確認します。
  3. ウイルス対策ソフトウェアがインストールされているかどうかを確認し、これが aspx ページにアクセスしているか、Asp.Net キャッシュに影響を与えているかを確認します。これにより、aspnet キャッシュ内の aspnet ページでのファイル ロックなどのコンパイルの問題が発生する可能性があります。(aspnet Web アプリケーションではなく、aspnet Web サイトのシナリオ) 奇妙な動作を引き起こす可能性があります。
  4. 切り捨てられたエントリがファイルの更新時刻と一致するかどうかを調べます。データベース エントリのタイムスタンプまたはロガーのタイムスタンプをファイルの更新時刻と相互参照します。
  5. ロガーを更新して、読み取られているファイルの内容全体をログに記録し、「ジャンクイン > ジャンクアウト」シナリオがないことを確認します。これを一晩実行して、サーバーのディスク容量に注意してください。
  6. Web アプリが実行されている App-Pool がいつリサイクルされるかを調べ、これを切り捨てられたエントリの時間と相互参照します。これは、ASP.NET ヘルス モニタリングを介してのみ web.config で実行できます。

あなたのコードは、エラーを埋める「try catch」で書かれています。キャッチしたエラーで何か役に立つことをしない場合は、キャッチしないでください。try catch ではなく、コードでエッジ ケースを処理します。 このサイトのこの try-catch の質問を参照してください

于 2012-10-23T20:33:49.743 に答える