0

私は小さなサービスを構築しました(c#、net 4)。開発環境でいくつかのテストと調整を行った後、自分の PC で試してみました。すべて正常に動作しています。

Windows 2008 R2 サーバー (実稼働環境) にサービスをインストールすると、1053 エラーが発生して開始されません (サービスがタイムリーに開始されません)。

奇妙なことに、サービスを開始すると、1、2 秒後に突然このエラーが発生します。オプション this.RequireMoreTime(120000) をサービスに追加し、ServicePipelineMode のレジストリ キーを編集しました。

いくつかの詳細情報:

  • Log4net を使用して、イベントをアプリケーション ログに記録しています。
  • カスタム ソース (powershell コマンドを使用して作成) を使用しています
  • サービスは、ネットワーク サービス アカウントで実行するように設定されています。管理者アカウントで開始すると、同じ結果が得られます。
  • すべての部分を Try - catch using log.error(exception.tostring()) の下に置きましたが、イベント ログには何も記録されません。
  • 私はウェブ上で多くの投稿を読みましたが、修正するのに役立つものは何もありません。
  • 開発者とサーバーには同じフレームワークがあります。

どんな助けでも大歓迎です。

よろしくお願いします。

編集:
プロジェクトの開始点である program.cs に try-catch を追加しようとしました:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    static void Main()
    {
        try
        {
            if (!EventLog.SourceExists("CheckMail"))
            {
                EventLog.CreateEventSource("CheckMail", "Application");
                EventLog.WriteEntry("EventSystem", "EventSource created");
            }

            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] { new CheckMailSvc() };
            ServiceBase.Run(ServicesToRun);
        }
        catch (Exception ex)
        { 
          string message = string.Format("Error starting Service {0}", ex.ToString());
          EventLog.WriteEntry("CheckMail", message, EventLogEntryType.Warning, 666);
        }
    }
}

何もトラップされません (EventSource create イベントも例外もありません)。

他のすべてのコードは try-catch にあり、log4net を使用してイベントをログに記録します (開発環境では正常に動作します)。

4

1 に答える 1

0

ご提案いただきありがとうございます。私のOnStartはこれです:

    protected override void OnStart(string[] args)
    {
        try
        {
            this.RequestAdditionalTime(30000);
            ServiceStart = DateTime.Now;
            XmlConfigurator.Configure();
            log4net.ThreadContext.Properties["EventID"] = 666;
            log.Info("Service Started");
            StringBuilder sb = new StringBuilder();
            sb.AppendLine("Service Configuration:");
            log.Info(sb.ToString());
            Timer t = new Timer(new TimerCallback(SendMail));
            t.Change(TimeSpan.Zero, TimeSpan.FromMinutes(every));
        }
        catch (Exception ex)
        {
            log.ErrorFormat("Error starting service: {0}", ex.ToString());
        }
    }

ご覧のとおり、おかしなことは何も起こらず、アプリケーション ログに開始メッセージが表示されるはずです。

于 2013-03-31T19:05:22.210 に答える