c#local服务启动然后停止..但在我的计算机上运行完美

时间:2014-05-30 14:39:13

标签: c# .net windows-8 windows-services

我一直在开发这个Windows服务,将一些数据从本地firebird数据库传输到SQL数据库。

我没有实际的安装程序安装程序,因为我只是掌握服务,但我确实包含了一个Project Installer,根据本教程 http://msdn.microsoft.com/en-us/library/zt39148a.aspx

以下是获得想法的开始:

namespace MyNewService
{
    public partial class MyNewService : ServiceBase
    {
        public MyNewService()
        {InitializeComponent();}

        static Timer timer;

        protected override void OnStart(string[] args)
        {
     this.AutoLog = false;
            if (!System.Diagnostics.EventLog.SourceExists("MySource"))
            {
                System.Diagnostics.EventLog.CreateEventSource(
                    "MySource", "MyLog");
            }
            eventLog1.Source = "MySource";

            timer = new Timer();
            timer.Interval = 10000;//set interval
            timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
            start_timer();
        }

        private void start_timer()
        {
            eventLog1.WriteEntry("In OnStart.");
            timer.Start();
        }

        private void timer_Elapsed(object sender, ElapsedEventArgs e)
        {
            eventLog1.WriteEntry("Starting Work. Time elapsed" + timer.Interval);

            string connFb = ConfigurationManager.ConnectionStrings["FbConString"].ConnectionString;
            FbConnection FbCon = new FbConnection(connFb);

            string connSql = ConfigurationManager.ConnectionStrings["SqlConString"].ConnectionString;
            SqlConnection SqlCon = new SqlConnection(connSql);

            try
            {
  FbCon.Open();
                SqlCon.Open();
            }
            catch (Exception e0)
            {
                eventLog1.WriteEntry("----------Exception Message: {0}" + e0.Message);
            }
            string FB1 = "SELECT FIRST 500 * FROM SC_JOBS ……";
            string sql1 = ("UPDATE Jobs SET JobID = @JId, …..)");
            using (FbCommand Command = new FbCommand(FB1, FbCon))
            {
                //Console.Write(line);
                DateTime date = new DateTime(2013, 1, 1, 0, 0, 0);
                try{
                    Command.Parameters.AddWithValue("@DT", date);
                    using (FbDataReader DbReader = Command.ExecuteReader())

                        while (DbReader.Read())
                        {
                            var Job = new Job();
                Job.JobID = Convert.ToInt32(DbReader["JOBSID"]);
// Some more processing going on...//

这是我的Appconfig

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <system.diagnostics>
    <switches></switches>
  </system.diagnostics>
  <connectionStrings>
    <add name="SqlConString" connectionString="user id=...; password=...;server=213.171....; database=...;MultipleActiveResultSets=True" />
    <add name="FbConString" connectionString="User=…;Password=….;Database=192.168…:C:\\Window Designer 7\\Database\\fdsdatabase.fds;DataSource=192.168….;Port=3050;Dialect=3;" providerName="FirebirdSql.Data.FirebirdClient"/>
  </connectionStrings>
</configuration>

我使用 installutil 安装该服务,并且至少在我的系统上,该服务运行完全正常。它也没有依赖项(只是一个firebird dll,它包含在带有服务exe的bin / debug文件夹中) 当我在另一台电脑上试用它(Windows 8 / .NET framework 4.5 / Visual studio express)时,它会因为我难以理解的原因而启动和停止。

我没有得到任何日志消息 我确实在事件查看器(Windows日志/应用程序)中遇到了这个错误,但只发生过一次:

“服务被标记为交互式服务。但是,系统配置为不允许交互式服务“

所以这就是我到目前为止所尝试的内容:

  • 清除应用程序日志 - 无变化
  • 启用交互式服务检测 - 我没有 错误1:功能不正确
  • 将“System.Diagnostics.Debugger.Launch();”添加到Main()中以捕获 潜在的启动错误我没有得到任何调试选项,我没有 知道在哪里寻找可能的日志条目

我知道这个问题之前已经被问了很多,但是我所经历的解决方案并没有让我失望。我正处于这个项目的最后期限,因此非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

根据我的经验,服务开始并立即停止的情况有两个原因之一。

第一个原因是程序员没有服务做任何事情,即它没有运行一个线程来保持服务的运行。鉴于您的服务适用于您的计算机,这不是问题。

第二个原因是服务构造函数或OnStart回调中发生异常。查看您的代码,您的服务构造函数是最小的,所以我怀疑问题出在哪里。但是,您的OnStart回调会尝试与事件日志进行交互,这需要一定量的提升用户权限。如果我不得不猜测,我会说试图检查是否&#34;我的来源&#34;存在或(更有可能)创建&#34;我的来源&#34;事件源正在抛出一个未被捕获或以某种方式记录的异常。要验证这一点,最好在问题机器上调试服务。当然,如果您有足够的用户权限,则可能无法实现。因此,您可以在OnStart的内容周围放置一个try-catch块,如果发生异常,请在您有权访问的文件夹中创建一个文本文件(例如,您的Users文件夹)并编写该文件的异常内容,包括堆栈跟踪,以便您可以更清楚地了解正在发生的事情。

如果问题不在OnStart回调中,则下一个要检查的位置是您的计时器回调函数。

HTH