Windowsサービスのテストに関する問題

c# sql-server-2005 windows-services
Windowsサービスのテストに関する問題

データベースにアクセスするWindowsサービスを作成したい。 私のデータベースはSQL Server 2005です。

実際、私はウェブサイトで作業しており、データベースはサーバー内にあります。 データベースに毎秒アクセスし、レコードを更新する必要があります。 そのために、サーバーにインストールしてタスクを実行するWindowsサービスを作成する必要があります。

ローカルマシンからデータベースにアクセスしてからサービスを実行していますが、問題はこのサービスをテストする方法がわからないことです。

ローカルマシンにインストールしようとしました。 インストールしてからサービスを実行しましたが、タスクを実行しなかったため、サービスがデータベースに接続できないと思います。

サービスにもインストーラーにも問題はありません。 唯一の問題は、Windowsサービスをテストする方法です。

  18  10


ベストアンサー

サービス/コンソールアプリのハイブリッドをいつでも作成でき、テスト目的でコンソールアプリを使用できます。

あなたがする必要があるのは次のようなものです-program.cs`で、 Main`メソッドを変更してサービスを実行するか、オプションでコンソールアプリとして実行します:

static class Program
{
    static void Main(params string[] args)
    {
        string firstArgument = string.Empty;

        if (args.Length > 0)
        {
            firstArgument = args[0].ToLowerInvariant();
        }

        if (string.Compare(firstArgument, "-console", true) == 0)
        {
            new YourServiceClass().RunConsole(args);
        }
        else
        {
            ServiceBase[] ServicesToRun = new ServiceBase[] { new YourServiceClass() };
            ServiceBase.Run(ServicesToRun);
        }
    }

そして、 ServiceBase`を継承し、 OnStart`と OnStop`を持つサービスクラスで、次のように RunConsole`メソッドを追加します。

    public void RunConsole(string[] args)
    {
        OnStart(args);

        Console.WriteLine("Service running ... press  to stop");

        //Console.ReadLine();
        while (true)
        { }

        OnStop();
    }

アプリを実行してその機能をテストする場合は、 -console`コマンドラインパラメーターを指定してEXEを起動し、 RunConsole`メソッドにブレークポイントを設定します。

20


Visual StudioソリューションをWindowsサービスアプリケーションに添付できます。 その後、通常のプロジェクトを実行するときにWindowsサービスをデバッグできます。

デバッグ→プロセスにアタッチします。

12


ロガーを使用してエラーを報告してください!

考えられるすべてのエラーをキャッチして、ファイルに記録するか、メールを送信するか、またはその両方を試してください。

Log4Netには、ローリングファイル、ダバターゼの永続性、さらにはSMTPメッセージを処理するロガーがあります。 たとえば、次を参照してください。 この種の雑用を避けるために、私はよくSMTPアペンダーを使用します。

乾杯、B.

3


marc_sによる答えは完璧ですが、サービスのメインスレッドが意図したとおりにユーザーの入力を待って一時停止することはありません。 これが彼が無限ループに入った理由だと思います。

コンソールを作成するためのhttps://stackoverflow.com/a/472286/212076[Igal Serban’s]コードから借用して、一時停止する `RunConsole()`メソッドの拡張機能を次に示します。

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool AllocConsole();

    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool FreeConsole();

    public void RunConsole(string[] args)
    {
        OnStart(args);

        AllocConsole();

        Console.WriteLine("Service running ... press  to stop");

        Console.ReadLine();

        FreeConsole();

        OnStop();
    }

3


いくつかの方法があります。

1)同じコードを呼び出す標準のWindowsアプリを作成します。これは実行とデバッグが簡単です。 これにより、サービスコードがすべてサービス内にあるのではなく、独自のアセンブリにリファクタリングされます。

2)サーバープログラムファイルで、サービスがインタラクティブに実行されているかどうかを検出し、サービス内のサービスメソッドを呼び出して1回実行します。 この方法では、Visual Studioからも実行できます。 (サービスメソッドなどを公開し、サービスのインスタンスを作成する必要があります)

2


誰もがたくさんの素晴らしい答えを提供してくれたと思います。 これは、この問題をデバッグするための私の順序付けられたアプローチです:

  • イベントログを確認してください。

  • すべてのエラーをログに記録します(Log4Net、Enterprise Library、または単にイベントに書き込む
    Log)、特にMainメソッドにtry..catchがあります。

  • 環境で実行できる単体テストを作成します。

  • app.configファイルが正しいことを確認してください。 値をマージする必要がある場合があります
    さまざまなプロジェクトから1つに。

  • データベース接続をテストします。 サーバーにpingします。 ポート1433へのTelnet(if
    デフォルトのSQL Server)。 テストする簡単なコンソールアプリを作成します。

  • プロセスにアタッチしてデバッグします。

  • コンソール/サービスハイブリッドアプローチを使用する
    デバッグメッセージをリアルタイムでストリーミングするため)。

2


タイトルとURLをコピーしました