3

ディレクトリを監視するWindowsサービスを作成しました。ファイルがダンプされると、データが取得され、データベースに配置されます。次に、このファイルを別のディレクトリに移動して削除します。デバッグモードでは正常に動作します。しかし、コンピューターにインストールすると、データをデータベースに投入した後に停止し、問題のファイルは移動も削除もされません。許可の問題が関係していると思われます。イベントログを作成しようとしました:

public Service1()
    {
        InitializeComponent();
        if (!System.Diagnostics.EventLog.SourceExists("MySource"))
        {
            System.Diagnostics.EventLog.CreateEventSource(
                "MySource", "MyNewLog");
        }
        eventLog1.Source = "MySource";
        eventLog1.Log = "MyNewLog";         
    }

だから私は3つの質問があります。(1) サービスがデバッグで説明されているように動作するのに、コンピューターにインストールすると失敗する原因は何ですか。(2) 上記のようにイベント ログを開始しました。しかし、サービス停止のイベントを記録するために他のコードを追加する必要がありますか? これは「onShutdown のオーバーライド」メソッドで行われると思います。(3) 最後に、サービスが停止したら、イベント ログを確認します。しかし、これを行う方法がわかりません。管理ツールにありますか? ディレクトリにファイルとして保存されますか?

以下に示す感謝のアドバイスの代わりに、この投稿を編集します。

      try
        {
            File.Move(e.FullPath, finalString);
            File.Delete(e.FullPath);
        }
        catch(Exception q)
        {
            EventLog.WriteEntry("MySource", q.ToString(), EventLogEntryType.Error);

            using (StreamWriter w = new StreamWriter(ConfigurationManager.AppSettings["fmd"], true))
            {
                w.Write(DateTime.Now.ToString("dd-MM-yyyy_hh-mm-ss"));
                w.Write(q.ToString());
            }
        }

提案に従って、ファイルの移動と削除に try-catch を配置し、さらに OnShutdown メソッドを追加しました。

 protected override void OnShutdown()
    {
        using (StreamWriter w = new StreamWriter(ConfigurationManager.AppSettings["ond"], true))
        {
            w.Write("stop OnShutdown");
        }
        //EventLog.WriteEntry("MySource", message, EventLogEntryType.Error);
    }

システムエラーメッセージをシャットダウンメソッドに渡す方法がわからないので、アドバイスをいただければ幸いです。変更したコードをサービスとしてインストールすると、ファイルを移動または削除する前に再び停止しました。ストリームによってアクセスされた 2 つのログはどちらも何も記録しませんでした。さらに、イベントビューアにも何も表示されませんでしたか?

4

3 に答える 3

1

デバッグで説明されているようにサービスが機能するのに、コンピューターにインストールすると失敗する原因は何ですか?

権限。別の ID を提供しなかった場合、LocalSystemサービスは実行されている可能性があります。Network Service

上記のようにイベント ログを開始しました。しかし、サービス停止のイベントを記録するために他のコードを追加する必要がありますか? これは「onShutdown のオーバーライド」メソッドで行われると思いますか?

はい、あなたの仮定は正しいです。

最後に、サービスが停止したら、イベント ログを確認します。しかし、これを行う方法がわかりません。管理ツールにありますか?

ヒットしてダイアログWindows Key+Rを取得し、と入力します。Runeventvwr

于 2013-10-09T12:36:34.320 に答える
0

さて、私はすべての騒ぎの理由を見つけました。最終的に、イベント ビューアーでいくつかのログを見つけました。これらは、カスタム ログの管理イベントにリストされていました。3 つのエラー ログがありました。.Net ランタイム。アプリケーション エラー & サービス コントロール マネージャー。「.Net ランタイム」では、スタックが system.windows.forms の未処理の例外を示していました。私はばかげて私のリリース バージョンにポップアップ ボックスを含めました。しかし、私がこれをコメントアウトしたときでさえ; エラーが発生しました。だから私は戻って、主にtry catchステートメントで他のメッセージボックスを見つけました。これらを削除して問題を解決しました。

于 2013-10-10T15:01:39.847 に答える