简体   繁体   中英

My .NET Windows service will not start

I wrote this .NET Windows Service application that is basically a file watcher. The service will monitor incoming .csv files, parse data from them, and add the data to spreadsheets. I installed the service on a server and tried to start it. I was given the warning, "The service started and then stopped. Some services stop automatically if they are not in use by other services or programs." In a debug attempt, I removed all the code and just had a bare service and it started/stopped fine. So I added the file watcher object and it popped the warning again. Next I changed the service to run with a local administrative account instead of the "LocalService" account then it worked. I added the rest of my code and it worked for awhile. I finished development and added the EventLog object and I was right back to the warning. I removed the EventLog object but still got the warning. I just do not know what is causing this to not start. Here is my service:

using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using OfficeOpenXml;
using System.Linq;
using System.ServiceProcess;
using System.Text;

namespace COD_Automation
{
public partial class COD_AUTO : ServiceBase
{
    FileSystemWatcher eWatcher;
    String remoteSrc;
    public static String filePath;
    public static String fileName;
    public static Boolean fileCheck;
    public static String modifiedDT;
    public static String remodifiedDT;
    public static String SampNum;
    public static String SampDate;
    public static String AnalysisInitials;
    public static int SampResult;
    public static double Dilution;
    public static FileInfo efile;
    public int rowIndex = 8;
    public int filterID = 1;

    public COD_AUTO()
    {
        InitializeComponent();

        if (!System.Diagnostics.EventLog.SourceExists("COD_Automation"))
        {
            System.Diagnostics.EventLog.CreateEventSource(
                "COD_Automation", "COD Automation Log");
        }

        serviceLog.Source = "COD_Automation";
        serviceLog.Log = "COD Automation Log";
    }

    protected override void OnStart(string[] args)
    {
        serviceLog.WriteEntry("COD Automation Service has started.");

        //Define the remote folder location to watch
        remoteSrc = "\\\\mkfiler01\\ops\\Envcom\\EXEC\\ENVCOM\\LAB\\COD\\Exports\\DataLog";

        //Create a new FileSystemWatcher and set its properties
        eWatcher = new FileSystemWatcher(remoteSrc, "*.csv");

        //Add event handler
        eWatcher.Created += new FileSystemEventHandler(eWatcher_Created);

        //Begin watching
        eWatcher.EnableRaisingEvents = true;
    }

    protected override void OnStop()
    {
        serviceLog.WriteEntry("COD Automation Service has stopped.");
        eWatcher.EnableRaisingEvents = false;
    }

    private void eWatcher_Created(object source, FileSystemEventArgs e)
    {
        filePath = e.FullPath;
        fileName = e.Name;
        ParseData(filePath);
        FileCheck(fileName);
        CreateExcelFile(fileCheck);
        AddSample(SampNum, SampDate, AnalysisInitials, SampResult, Dilution);
    }

    public void ParseData(String filePath)
    {
        //Create a dictionary collections with int keys (rowNums) and String values (each line of Strings)
        Dictionary<int, String> eachCSVLine = new Dictionary<int, string>();

        //String array that holds the contents of the specified row
        String[] lineContent;

        int rowNum = 1;

        foreach (string line in File.ReadLines(filePath))
        {
            eachCSVLine.Add(rowNum, line);
            rowNum++;
        }

        //Get the required line and split it by "," into an array
        String reqLine = eachCSVLine[5];
        lineContent = reqLine.Split(',');

        //Get the required values(index 2 for parsed Operator ID, index 4 for parsed Sample Number, index 11 for Sample Result)
        AnalysisInitials = lineContent.GetValue(2).ToString();
        SampNum = lineContent.GetValue(3).ToString();      //sample number            

        String result = lineContent.GetValue(11).ToString();
        String dilute = lineContent.GetValue(8).ToString();
        Dilution = Double.Parse(dilute);
        SampResult = Int32.Parse(result);    //sample result
    }

    public void AddSample(String SampleNum, String SampleDate, String AnalysisInitials, int SampleResult, double Diluted)
    {
        try
        {
            using (ExcelPackage excelPackage = new ExcelPackage(efile))
            {
                ExcelWorksheet worksheet = excelPackage.Workbook.Worksheets[1];
                var cell = worksheet.Cells;

                //check to see if this is the first sample added --if true, add the first sample --if false, increment rowindex & filterID then add the sample to next available row
                if (cell["A8"].Value == null)
                {
                    cell["B5"].Value = SampleDate;
                    cell["B6"].Value = AnalysisInitials;
                    cell[rowIndex, 1].Value = filterID;  //Filter ID
                    cell[rowIndex, 2].Value = SampleNum;   //Sample Number
                    cell[rowIndex, 3].Value = Dilution;   //Dilution
                    cell[rowIndex, 4].Value = SampleResult;   //Meter Reading
                }
                else
                {
                    while (!(cell["A8"].Value == null))
                    {
                        rowIndex++;
                        filterID++;
                        if (cell[rowIndex, 1].Value == null)  //ensures that the new row is blank so the loop can break to continue adding the sample
                        { break; }
                    }

                    //add the sample to the next empty row
                    cell[rowIndex, 1].Value = filterID;  //Filter ID
                    cell[rowIndex, 2].Value = SampleNum;   //Sample Number
                    cell[rowIndex, 3].Value = Dilution;   //Dilution
                    cell[rowIndex, 4].Value = SampleResult;   //Meter Reading
                }
                excelPackage.Save();
            }
        }
        catch (Exception e)
        {
            serviceLog.WriteEntry("Sample could not be added to the spreadsheet because of the following error: " + e.Message + ".");
        }
    }

    public Boolean FileCheck(String fileName)
    {
        //Get the date of the .csv file
        String[] fNames = fileName.Split('_');
        String fDate = fNames.ElementAt(3);
        DateTime dt = Convert.ToDateTime(fDate);

        //format the file date into the proper format and convert to a string
        modifiedDT = dt.ToString("MMddyy");

        //modify the "modifiedDT to get the sample date to insert into spreadsheet            
        String mdate = modifiedDT.Insert(2, "/");
        remodifiedDT = mdate.Insert(5, "/");
        SampDate = remodifiedDT;         //sample date           

        //assign an excel filename
        String exFile = @"\\mkfiler01\ops\Envcom\EXEC\ENVCOM\LAB\COD\Imports\" + modifiedDT + "COD-" + AnalysisInitials + ".xlsx";

        //check for file existence
        if (File.Exists(exFile))
        { fileCheck = true; }
        else
        { fileCheck = false; }

        return fileCheck;
    }

    public void CreateExcelFile(Boolean fileCheck)
    {
        if (fileCheck)
        {
            efile = new FileInfo(@"\\mkfiler01\ops\Envcom\EXEC\ENVCOM\LAB\COD\Imports\" + modifiedDT + "COD-" + AnalysisInitials + ".xlsx");

            using (ExcelPackage excelPackage = new ExcelPackage(efile))
            {
                //Read the existing file to see if the Analysis Initials match the AnalysisInitial variable value
                ExcelWorksheet worksheet = excelPackage.Workbook.Worksheets[1];
                String initials = worksheet.Cells["B6"].Value.ToString();

                //If initials = AnalysisIntials then assign the existing file the WB variable, else create a new file for the different AnalysisInitials
                if (initials.Equals(AnalysisInitials))
                {
                    excelPackage.Save();
                }
                else
                {
                    try
                    {
                        //Excel COD Template to use to create new Excel spreadsheet
                        FileInfo template = new FileInfo(@"\\mkfiler01\ops\Envcom\EXEC\ENVCOM\LAB\COD\COD TEMPLATE.xlsx");

                        //The new Excel spreadsheet filename
                        FileInfo newFile = new FileInfo(@"\\mkfiler01\ops\Envcom\EXEC\ENVCOM\LAB\COD\Imports\" + modifiedDT + "COD-" + AnalysisInitials + ".xlsx");

                        // Using the template to create the newfile
                        using (ExcelPackage excelPackage1 = new ExcelPackage(newFile, template))
                        {
                            // save the new Excel spreadsheet                                
                            excelPackage1.Save();
                        }
                    }
                    catch (Exception ex)
                    {
                        serviceLog.WriteEntry("Excel file could not be created because " + ex.Message);
                    }
                }
            }
        }
        else
        {
            try
            {
                efile = new FileInfo(@"\\mkfiler01\ops\Envcom\EXEC\ENVCOM\LAB\COD\Imports\" + modifiedDT + "COD-" + AnalysisInitials + ".xlsx");

                //Excel COD Template to use to create new Excel spreadsheet
                FileInfo template = new FileInfo(@"\\mkfiler01\ops\Envcom\EXEC\ENVCOM\LAB\COD\COD TEMPLATE.xlsx");

                //The new Excel spreadsheet filename
                FileInfo newFile = new FileInfo(@"\\mkfiler01\ops\Envcom\EXEC\ENVCOM\LAB\COD\Imports\" + modifiedDT + "COD-" + AnalysisInitials + ".xlsx");

                // Using the template to create the newfile
                using (ExcelPackage excelPackage = new ExcelPackage(newFile, template))
                {
                    // save the new Excel spreadsheet                        
                    excelPackage.Save();
                }
            }
            catch (Exception ex)
            {
                serviceLog.WriteEntry("Excel file could not be created because " + ex.Message);
            }
        }

    }        
}

}

My EventViewer was showing details of an ArgumentException in regards to the Source and Log properties of the EventLog object. I changed the following code:

if (!System.Diagnostics.EventLog.SourceExists("COD_Automation"))
    {
        System.Diagnostics.EventLog.CreateEventSource(
            "COD_Automation", "COD Automation Log");
    }

    serviceLog.Source = "COD_Automation";
    serviceLog.Log = "COD Automation Log";

into the following code:

if (!EventLog.SourceExists("COD_Automation"))
        {
            EventLog.CreateEventSource("COD_Automation", "Application");
        }

        serviceLog.Source = "COD_Automation";
        serviceLog.Log = "Application";

This fixed my problem. I was initially trying to register the COD_Automation source in the COD_Automation Log which doesn't exist. So I set the Log property to the correct log of "Application".

The LocalService account will not have access to a UNC share like \\\\mkfiler01 . My guess is that you are getting an access denied error when trying to access that file share.

Set the service to run under a domain account that has access to that share.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM