2016-01-20 10 views
0

Я пытаюсь отправить пользовательские команды службе, используя форму окна. Команда, которую я пытаюсь отправить, пытается поместить файл в изолированное хранилище. Ниже мой исходный код.Отправка пользовательских команд службе с использованием формы окна

Форма

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.ServiceProcess; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using Project2Service; 

namespace Project2 
{ 
    public partial class Form1 : Form 
    { 
     public Service1 s = new Service1(); 
     public ServiceInstaller si = new ServiceInstaller(); 
     public ProjectInstaller pi = new ProjectInstaller(); 
     public ServiceController sc = new ServiceController("Project2Service"); 

     private string[] isoType; 

     string machineName = System.Windows.Forms.SystemInformation.ComputerName; 

     public Form1() 
     { 
      InitializeComponent(); 

      isoType = new string[] { "User", "Assembly And Domain"}; 
      cboIsoType.Items.AddRange(isoType); 

      cboIsoType.SelectedIndex = 0; 

      btnContinue.Enabled = false; 
      btnPause.Enabled = false; 
      btnStop.Enabled = false; 
     } 

     public void Labels() 
     { 
      lblMachine.Text = machineName; 
      lblSName.Text = s.ServiceName; 
      lblSType.Text = si.StartType.ToString(); 

      lblSStatus.Text = sc.Status.ToString(); 
      lblPause.Text = sc.CanPauseAndContinue.ToString(); 
      lblShutdown.Text = sc.CanShutdown.ToString(); 
      lblStop.Text = sc.CanStop.ToString(); 
     } 

     private void btnStart_Click(object sender, EventArgs e) 
     { 
      //Controller.Refresh(); //Gets the current status of service 
      //if (Controller.Status == ServiceControllerStatus.Stopped) 
      //{ 
      // Controller.Start(); 
      //} 

      sc.Start(); 
      sc.WaitForStatus(ServiceControllerStatus.Running); 
      Labels(); 

      btnStart.Enabled = false; 
      btnContinue.Enabled = false; 
      btnStop.Enabled = true; 
      btnPause.Enabled = true; 

     } 

     private void btnStop_Click(object sender, EventArgs e) 
     { 
      sc.Stop(); 
      sc.WaitForStatus(ServiceControllerStatus.Stopped); 
      Labels(); 

      btnStart.Enabled = true; 
      btnContinue.Enabled = false; 
      btnPause.Enabled = false; 
      btnStop.Enabled = false; 
     } 

     private void btnPause_Click(object sender, EventArgs e) 
     { 
      sc.Pause(); 
      sc.WaitForStatus(ServiceControllerStatus.Paused); 
      Labels(); 

      btnPause.Enabled = false; 
      btnContinue.Enabled = true; 
      btnStart.Enabled = false; 
      btnStop.Enabled = true; 
     } 

     private void btnContinue_Click(object sender, EventArgs e) 
     { 
      sc.Continue(); 
      sc.WaitForStatus(ServiceControllerStatus.Running); 
      Labels(); 

      btnStop.Enabled = true; 
      btnStart.Enabled = false; 
      btnPause.Enabled = true; 
      btnContinue.Enabled = false; 
     } 

     private void btnSubmit_Click(object sender, EventArgs e) 
     { 
      if (cboIsoType.SelectedItem.ToString() == "User") 
      { 

       sc.ExecuteCommand(128); 
      } 
     } 
    } 
} 

Сервис

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Diagnostics; 
using System.IO; 
using System.IO.IsolatedStorage; 
using System.Linq; 
using System.ServiceProcess; 
using System.Text; 
using System.Threading.Tasks; 

namespace Project2Service 
{ 
    public partial class Service1 : ServiceBase 
    { 
     public enum ServiceCustomCommands { Command1 = 128, Command2 = 129 }; 
     //private IsolatedStorageScope iso; 

     public Service1() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnStart(string[] args) 
     { 

      //iso = IsolatedStorageScope.User | IsolatedStorageScope.Domain; 
      FileSystemWatcher Watcher = new FileSystemWatcher(@"C:\Users\Martin\Desktop\Project2\ServiceTest"); 
      Watcher.EnableRaisingEvents = true; 
      Watcher.NotifyFilter = NotifyFilters.LastAccess 
         | NotifyFilters.LastWrite 
         | NotifyFilters.FileName 
         | NotifyFilters.DirectoryName; 

      Watcher.Changed += new FileSystemEventHandler(Watcher_Changed); 
      Watcher.Created += new FileSystemEventHandler(Watcher_Created); 
      Watcher.Deleted += new FileSystemEventHandler(Watcher_Deleted); 
      Watcher.Renamed += new RenamedEventHandler(Watcher_Renamed); 
      WriteServiceInfo("Service Started!"); 
     } 

     // This event is raised when a file is changed 
     private void Watcher_Changed(object sender, FileSystemEventArgs e) 
     { 
      WriteServiceInfo("File Changed!"); 

      DirectoryInfo d = new DirectoryInfo(@"C:\Users\Martin\Desktop\Project2\ServiceTest");//Assuming Watch is your Folder 
      FileInfo[] Files = d.GetFiles("*.txt"); //Getting Text files 
      string str = ""; 
      foreach (FileInfo file in Files) 
      { 
       str = str + ", " + file.Name; 
       str = str + ", " + file.LastWriteTime; 
       str = str + ", " + file.CreationTime; 
       str = str + ", " + file.Length; 

       WriteServiceInfo(file.Name); 
       WriteServiceInfo(file.LastWriteTime.ToString()); 
       WriteServiceInfo(file.CreationTime.ToString()); 
       WriteServiceInfo(file.Length.ToString()); 
      } 
     } 

     private void Watcher_Created(object sender, FileSystemEventArgs e) 
     { 
      WriteServiceInfo("File Created!"); 
     } 

     private void Watcher_Deleted(object sender, FileSystemEventArgs e) 
     { 
      WriteServiceInfo("File Deleted!"); 
     } 
     private void Watcher_Renamed(object sender, FileSystemEventArgs e) 
     { 
      WriteServiceInfo("File Renamed!"); 
     } 

     private void WriteServiceInfo(string info) 
     { 
      FileStream fs = new FileStream(@"C:\Users\Martin\Desktop\Project2\WindowsServiceLog.txt", 
           FileMode.OpenOrCreate, FileAccess.Write); 
      StreamWriter m_streamWriter = new StreamWriter(fs); 
      m_streamWriter.BaseStream.Seek(0, SeekOrigin.End); 
      m_streamWriter.WriteLine(info + "\n"); 
      m_streamWriter.Flush(); 
      m_streamWriter.Close(); 
     } 

     protected override void OnStop() 
     { 
      WriteServiceInfo("Service Stopped!"); 

     } 

     protected override void OnCustomCommand(int command) 
     { 


      switch ((ServiceCustomCommands)command) 
      { 
       case ServiceCustomCommands.Command1: 
        //Command1 Implementation 
        IsolatedStorageFile isoFile = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly, null, null); 
        IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream("LaptopInfo.txt", FileMode.Append, FileAccess.Write, isoFile); 
        using (StreamWriter writer = new StreamWriter(isoStream)) 
        { 
         writer.WriteLine("Data"); 
        } 
        //iso = IsolatedStorageScope.User; 
        break; 
       case ServiceCustomCommands.Command2: 
        //iso = IsolatedStorageScope.User | IsolatedStorageScope.Assembly; 
        break; 
       default: 
        break; 

      } 
     } 
    } 
} 

sc.ExecuteCommand (128); в методе кнопки отправки, похоже, не срабатывает.

+0

ли вы отладки службы проверить, что 'OnCustomCommand' был выполнен? –

+0

@YacoubMassad Я положил точку останова на этот метод, и когда я нажимаю кнопку, ничего не происходит. –

+0

Вы уверены, что 'sc.ExecuteCommand (128)' был выполнен? Я вижу там выражение 'if'. –

ответ

1

Это сработало отлично для меня, поэтому я предполагаю, что ваш код не попадает в вызов, чтобы выполнить команду. Я взял ваш код, сделал его немного легче.

Например, удалив все вышеперечисленное, этот код ниже работал, и текстовый файл появился с помощью команды «Received».

В вашем случае может случиться так, что вы не закрываете файл. Попробуйте это:

 
using (
    IsolatedStorageFile isoFile = 
     IsolatedStorageFile.GetStore(
      IsolatedStorageScope.User | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly, 
      null, null)) 
{ 
    IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream("LaptopInfo.txt", 
     FileMode.Append, FileAccess.Write, isoFile); 
    using (StreamWriter writer = new StreamWriter(isoStream)) 
    { 
     writer.WriteLine("Data"); 
    } 
    WriteServiceInfo("data written to isolated storage"); 
    isoFile.Close(); 
} 

Я изменил кнопку отправки, чтобы просто отправить команду, я хотел бы предложить то же самое

 
private void btnSubmit_Click(object sender, EventArgs e) 
{ 
    sc.ExecuteCommand(128); 
} 

Сервис-код выглядит следующим образом

 
using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Diagnostics; 
using System.IO; 
using System.IO.IsolatedStorage; 
using System.Linq; 
using System.ServiceProcess; 
using System.Text; 
using System.Threading.Tasks; 

namespace Project2Service 
{ 
    public partial class Service1 : ServiceBase 
    { 
     public enum ServiceCustomCommands { Command1 = 128, Command2 = 129 }; 
     //private IsolatedStorageScope iso; 

     public Service1() 
     { 
      InitializeComponent(); 
     } 

     protected override void OnStart(string[] args) 
     { 
      WriteServiceInfo("Service Started!"); 
     } 

     // This event is raised when a file is changed 
     private void Watcher_Changed(object sender, FileSystemEventArgs e) 
     { 
      WriteServiceInfo("File Changed!"); 
     } 

     private void Watcher_Created(object sender, FileSystemEventArgs e) 
     { 
      WriteServiceInfo("File Created!"); 
     } 

     private void Watcher_Deleted(object sender, FileSystemEventArgs e) 
     { 
      WriteServiceInfo("File Deleted!"); 
     } 
     private void Watcher_Renamed(object sender, FileSystemEventArgs e) 
     { 
      WriteServiceInfo("File Renamed!"); 
     } 

     private void WriteServiceInfo(string info) 
     { 
      FileStream fs = new FileStream(@"C:\Users\Adam\Desktop\WindowsServiceLog.txt", 
           FileMode.OpenOrCreate, FileAccess.Write); 
      StreamWriter m_streamWriter = new StreamWriter(fs); 
      m_streamWriter.BaseStream.Seek(0, SeekOrigin.End); 
      m_streamWriter.WriteLine(info + "\n"); 
      m_streamWriter.Flush(); 
      m_streamWriter.Close(); 
     } 

     protected override void OnStop() 
     { 
      WriteServiceInfo("Service Stopped!"); 

     } 

     protected override void OnCustomCommand(int command) 
     { 

      WriteServiceInfo("Command received"); 
      switch ((ServiceCustomCommands)command) 
      { 
       case ServiceCustomCommands.Command1: 
        //Command1 Implementation 
        IsolatedStorageFile isoFile = IsolatedStorageFile.GetStore(IsolatedStorageScope.User | IsolatedStorageScope.Domain | IsolatedStorageScope.Assembly, null, null); 
        IsolatedStorageFileStream isoStream = new IsolatedStorageFileStream("LaptopInfo.txt", FileMode.Append, FileAccess.Write, isoFile); 
        using (StreamWriter writer = new StreamWriter(isoStream)) 
        { 
         writer.WriteLine("Data"); 
        } 
        //iso = IsolatedStorageScope.User; 
        break; 
       case ServiceCustomCommands.Command2: 
        //iso = IsolatedStorageScope.User | IsolatedStorageScope.Assembly; 
        break; 
       default: 
        break; 

      } 
     } 
    } 
} 
+0

Да, я вижу, что методы выполняются. Почему коммутатор не выполняет и не помещает файл в изолированное хранилище. –

+0

См. Правки выше –