ایجاد log file با استفاده از windows services در #C

جمعه 17 مهر 1394

در این مقاله به توضیح مثالی ساده برای ارسال فایل متنی با استفاده از سی شارپ در windows service می پردازیم. ,ویندوز سرویس ها دو حالت پشتیبانی interval mode و daily mode را برای اجرا در ویندوز دارد. در هنگام نصب و را اندازی فایل exe شما در services قرار میگیرد.

ایجاد log file با استفاده از windows services  در #C

سرویس ویندوز 2 حالت پشتیبانی خواهد داشت

1-interval mode: در این حالت سرویس ویندوز اجرای یک کار را در فواصل منظم و با کمی تاخیر انجام میدهد.

2-daily mode: وقتی سرویس ویندوز در زمان خاصی از روز یک کار خاص را انجام میدهد.

خب به سراغ مثال میرویم. ابتدا یک پروژه جدید به زبان سی شارپ مانند شکل زیر ایجاد کنید.

سپس یک فایل App.config را اضافه میکنیم.

بعد از ان نیاز به یک نرم افزار  فایل پیکربندی (App.Config)داریم. این فایل برای کنترل خدمات windows service و استفاده از ان در حالت های مختلف می باشد.

پس از اضافه کردن شما باید کد زیر را داخل فایل App.config قرار دهید.

<?xmlversion="1.0"encoding="utf-8" ?>
<configuration>
    <appSettings>
        <add key ="Mode" value ="Daily"/>
        <!-- <add key ="Mode" value ="Interval"/>-->
        <add key ="IntervalMinutes" value ="1"/>
        <add key ="ScheduledTime" value ="18:41"/>
    </appSettings>
</configuration>

در کد بالا Scheduledtime وقتی استفاده می شود که mode  روی daily  قرار بگیرد. و  value هم با فرمت 24 ساعته است که در اینجا 18:41 در نظر گرفته شده است.

تنظیمات تایمر

یک کلاس با نام service1.cs ایجاد میکنیم و فضاهای نام زیر را در ان قرار میدهیم

using System.IO;
using System.Threading;
using System.Configuration;
public partial class Service1 : ServiceBase
{
    public Service1()
    {
        InitializeComponent();
    }
 
    protected override void OnStart(string[] args)
    {
        this.WriteToFile("Simple Service started {0}");
        this.ScheduleService();
    }
 
    protected override void OnStop()
    {
        this.WriteToFile("Simple Service stopped {0}");
        this.Schedular.Dispose();
    }
 
    private Timer Schedular;
 
    public void ScheduleService()
    {
        try
        {
            Schedular = new Timer(new TimerCallback(SchedularCallback));
            string mode = ConfigurationManager.AppSettings["Mode"].ToUpper();
            this.WriteToFile("Simple Service Mode: " + mode + " {0}");
 
            //Set the Default Time.
            DateTime scheduledTime = DateTime.MinValue;
 
            if (mode == "DAILY")
            {
                //Get the Scheduled Time from AppSettings.
                scheduledTime = DateTime.Parse(System.Configuration.ConfigurationManager.AppSettings["ScheduledTime"]);
                if (DateTime.Now > scheduledTime)
                {
                    //If Scheduled Time is passed set Schedule for the next day.
                    scheduledTime = scheduledTime.AddDays(1);
                }
            }
 
            if (mode.ToUpper() == "INTERVAL")
            {
                //Get the Interval in Minutes from AppSettings.
                int intervalMinutes = Convert.ToInt32(ConfigurationManager.AppSettings["IntervalMinutes"]);
 
                //Set the Scheduled Time by adding the Interval to Current Time.
                scheduledTime = DateTime.Now.AddMinutes(intervalMinutes);
                if (DateTime.Now > scheduledTime)
                {
                    //If Scheduled Time is passed set Schedule for the next Interval.
                    scheduledTime = scheduledTime.AddMinutes(intervalMinutes);
                }
            }
 
            TimeSpan timeSpan = scheduledTime.Subtract(DateTime.Now);
            string schedule = string.Format("{0} day(s) {1} hour(s) {2} minute(s) {3} seconds(s)", timeSpan.Days, timeSpan.Hours, timeSpan.Minutes, timeSpan.Seconds);
 
            this.WriteToFile("Simple Service scheduled to run after: " + schedule + " {0}");
 
            //Get the difference in Minutes between the Scheduled and Current Time.
            int dueTime = Convert.ToInt32(timeSpan.TotalMilliseconds);
 
            //Change the Timer's Due Time.
            Schedular.Change(dueTime, Timeout.Infinite);
        }
        catch(Exception ex)
        {
            WriteToFile("Simple Service Error on: {0} " + ex.Message + ex.StackTrace);
 
            //Stop the Windows Service.
            using (System.ServiceProcess.ServiceController serviceController = new System.ServiceProcess.ServiceController("SimpleService"))
            {
                serviceController.Stop();
            }
        }
    }
 
    private void SchedularCallback(object e)
    {
        this.WriteToFile("Simple Service Log: {0}");
        this.ScheduleService();
    }
 
    private void WriteToFile(string text)
    {
        string path = "C:\\ServiceLog.txt";
        using (StreamWriter writer = new StreamWriter(path, true))
        {
            writer.WriteLine(string.Format(text, DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss tt")));
            writer.Close();
        }
    }
}

مراحل رامطابق شکل زیر انجام دهید.

روی service1 راست کلیک کنید و view designer را انتخاب نمایید.

سپس در صفحه باز شده راست کلیک کنید و گزینه  AddInstaller را کلیک کنید.

در انجام مرحله بالا یک کلاس با نام Projectinstaller اضافه می شود. در حال حاضر شما نیاز دارید کلاس projectinstaller.designer را باز کنید  و به initalizecomponent نگاه کنید. در این روش ما servicename را تغییر میدهیم و همچنین starttype ان را به صورت اتوماتیک تنظیم میکنیم. به طوری که همواره با کامپیوتر windows service  به طور خودکار کار کند.

اگر start type شما به صورت اتوماتیک تنظیم نیست مقدار پیش فرض دستی است. و از این رو ویندوز نمیتواند به طور خودکار شروع به کار کند.


private void InitializeComponent()
{
    this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();
    this.serviceInstaller1 = new System.ServiceProcess.ServiceInstaller();
    //
    // serviceProcessInstaller1
    //
    this.serviceProcessInstaller1.Password = null;
    this.serviceProcessInstaller1.Username = null;
    //
    // serviceInstaller1
    //
 
    //Set the ServiceName of the Windows Service.
    this.serviceInstaller1.ServiceName = "SimpleService";
 
    //Set its StartType to Automatic.
    this.serviceInstaller1.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
 
    //
    // ProjectInstaller
    //
    this.Installers.AddRange(new System.Configuration.Install.Installer[] {
    this.serviceProcessInstaller1,
    this.serviceInstaller1});
}

ساخت ویندوز سرویس به طور خودکار پس از شروع  نصب و راه اندازی

پس از نصب و راه اندازی  برای شروع ویندوز سرویس به صورت دستی از طریق بخش sevices از کنترل پنل استفاده میکنیم.

projectinstaller را باز میکنیم و کد زیر را به ان اضافه میکنیم.


[RunInstaller(true)]
public partial class ProjectInstaller : System.Configuration.Install.Installer
{
    public ProjectInstaller()
    {
        InitializeComponent();
    }
 
    protected override void OnAfterInstall(IDictionary savedState)
    {
        base.OnAfterInstall(savedState);
 
        //The following code starts the services after it is installed.
        using (System.ServiceProcess.ServiceController serviceController = new System.ServiceProcess.ServiceController(serviceInstaller1.ServiceName))
        {
            serviceController.Start();
        }
    }
}

نصب ویندوز سرویس با استفاده از InstallUtil.exe

هنگامی که تمام فرایندها کامل هستند ما میتوانیم وب سرور خود را ایجاد کنیم.هنگامی که ما وب سرویس را ساختیم نیاز است که فایل exe را از پوشه debug در پروژه پیدا کنیم.نام فایل exe  همان نام پروژه میباشد.

نحوه installutil

InstallUtil /i C:\Users\Mudassar\Projects\WindowsService\bin\Debug\WindowsService.exe

commandprompt را باز میکنیم و دستور installutil را در ان اجرا میکنیم.

مسیر فایل  C:\Windows\Microsoft.NET\Framework\v4.0.30319  می باشد.

پس از اجرا پنجره زیر نمایش داده می شود.

پس از نصب موفقیت امیز شما پیام زیر را باید دریافت کنید.

شما میتوانید در پنجره services وب سرویس را بیابید.

حذف وب سرویس هم بسیار شبیه به نحوه نصب است از کد زیر برای حذف استفاده کنید.

InstallUtil /u C:\Users\Mudassar\Projects\WindowsService\bin\Debug\WindowsService.exe

آموزش سی شارپ

فایل های ضمیمه

برنامه نویسان

نویسنده 3355 مقاله در برنامه نویسان
  • C#.net
  • 4k بازدید
  • 7 تشکر

کاربرانی که از نویسنده این مقاله تشکر کرده اند

در صورتی که در رابطه با این مقاله سوالی دارید، در تاپیک های انجمن مطرح کنید