Converting Console app to Windows Service

自作多情 提交于 2020-08-24 08:19:43

问题


Am trying to convert my console application, which generates pdf reports, into a windows service. My code is as follows. Am I on the right direction? I installed this service and start/stop works fine but no report is generated! The console app alone works fine to generate Output.pdf. My aim is to Generate ouput when the service starts.

class Program : ServiceBase
{
    public Program()
    {
        this.ServiceName = "My PdfGeneration";
    }
    static void Main(string[] args)
    {

        ServiceBase.Run(new Program());
    }
    protected override void OnStart(string[] args)
    {
        EventLog.WriteEntry("My PdfGeneration Started");
        //base.OnStart(args);
        //Customise parameters for render method
        Warning[] warnings;
        string[] streamIds;
        string mimeType = string.Empty;   //"application/pdf";
        string encoding = string.Empty;
        string filenameExtension = string.Empty;
        string deviceInfo = "<DeviceInfo>" + "<OutputFormat>PDF</OutputFormat>" + "<PageWidth>15in</PageWidth>" + "<PageHeight>11in</PageHeight>" + "<MarginTop>0.5in</MarginTop>" + "<MarginLeft>0.5in</MarginLeft>" + "<MarginRight>0.5in</MarginRight>" + "<MarginBottom>0.5in</MarginBottom>" + "</DeviceInfo>";

        //Create a SqlConnection to the AdventureWorks2008R2 database. 
        SqlConnection connection = new SqlConnection("data source=localhost;initial catalog=pod;integrated security=True");

        //Create a SqlDataAdapter for the Sales.Customer table.
        SqlDataAdapter adapter = new SqlDataAdapter();

        // A table mapping names the DataTable.
        adapter.TableMappings.Add("View", "Route_Manifest");

        // Open the connection.
        connection.Open();
        Console.WriteLine("\nThe SqlConnection is open.");

        // Create a SqlCommand to retrieve Suppliers data.
        SqlCommand command = new SqlCommand("SELECT TOP 10 [RouteID],[FullTruckID],[DriverID],[DriverName],[StopID],[CustomerID],[CustomerName],[InvoiceID],[last_modified],[Amount] FROM [pod].[dbo].[Route_Manifest]", connection);
        command.CommandType = CommandType.Text;

        // Set the SqlDataAdapter's SelectCommand.
        adapter.SelectCommand = command;
        command.ExecuteNonQuery();

        // Fill the DataSet.
        DataSet dataset = new DataSet("Route_Manifest");
        adapter.Fill(dataset);

        //Set up reportviewver and specify path
        ReportViewer viewer = new ReportViewer();
        viewer.ProcessingMode = ProcessingMode.Local;
        viewer.LocalReport.ReportPath = @"C:\Documents and Settings\xxxxx\My Documents\Visual Studio 2008\Projects\PdfReportGeneration\PdfReportGeneration\Report.rdlc";

        //specify the dataset syntax = (datasetofreport.rdlc,querydataset); 
        viewer.LocalReport.DataSources.Add(new ReportDataSource("podDataSet_Route_Manifest", dataset.Tables[0]));


        //Now render it to pdf
        try
        {
            byte[] bytes = viewer.LocalReport.Render("PDF", deviceInfo, out mimeType, out encoding, out filenameExtension, out streamIds, out warnings);
            //output to bin directory 
            using (System.IO.FileStream fs = new System.IO.FileStream("output.pdf", System.IO.FileMode.Create))
            {
                //file saved to bin directory
                fs.Write(bytes, 0, bytes.Length);
            }
            Console.WriteLine("\n YEP!! The report has been generated:-)");

            /*           //Save report to D:\ -- later
                         FileStream fsi = new FileStream(@"D:\output.pdf", System.IO.FileMode.Create);
            */
        }
        catch (Exception e)
        {
            Console.WriteLine("\n CHEY!!!this Exception encountered:", e);
        }


        // Close the connection.
        connection.Close();
        Console.WriteLine("\nThe SqlConnection is closed.");
        Console.ReadLine();

    }
    protected override void OnStop()
    {
        EventLog.WriteEntry("My PdfGeneration Stopped");
            base.OnStop();
    }

}

回答1:


I would advise that you move the code in your OnStart event to a separate thread, since your service will need to start in a timely matter, else it can potentially time out on start up.

E.g

using System.ServiceProcess;
using System.Threading;

namespace myService
{
    class Service : ServiceBase
    {
        static void Main()
        {
            ServiceBase.Run(new Service());
        }

        public Service()
        {
            Thread thread = new Thread(Actions);
            thread.Start();
        }

        public void Actions()
        {
            // Do Work
        }
    }
}

You might also want to check if the executing user (user context in which the service runs) has rights to the folder you're writing to etc.

You will also need to write your errors to the event log instead of writing them to the console window like seen in your snippet (your code is swallowing exceptions at the moment thats why you cant pin point whats going wrong)

Read more over here: C# Basics: Creating a Windows Service




回答2:


Yes and no, what you should do is to define what OperationContract you are in the process of exposing by defining an interface.

For instance see this on channel 9:
http://channel9.msdn.com/Shows/Endpoint/Endpoint-Screencasts-Creating-Your-First-WCF-Service

you should define this service is a separate library assembly (because tomorrow you'll want to host this service somewhere else and very likely while developing, in a console application).

consuming the service you need to consider if it should be from an asp.net web page, a windows forms program or a console utility, really depending on your consumer scenario you'd want to externalize the actual pdf functionality in a separate class (in same library assembly) so that the day you want to just be able to do that in one of you other programs, it will not have to communicate with a wcf service somewhere on the network, though such a thing is nifty in itself it affects performance to integrate across process to a limited degree.



来源:https://stackoverflow.com/questions/19558801/converting-console-app-to-windows-service

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!