2016-01-20 122 views
0

我试图发送自定义命令的Windows服务。我的应用程序有一个窗口服务和一个窗体。当服务运行时,我想使用按钮单击事件在独立存储中创建一个文件。我正在使用本教程http://arcanecode.com/2007/05/30/windows-services-in-c-sending-commands-to-your-windows-service-part-7/。当我运行该程序并单击该按钮时似乎没有任何事情发生,并且该文件未放置到独立存储中。我已经在这些方法上设置了断点,以查看它们是否执行并且它们似乎有效。我不确定按钮点击方法是否可以从表单中的服务中获得隔离存储代码,但根据本教程我看不出问题会是什么。下面的源代码。发送命令到Windows服务

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) 
     { 
      ServiceController sc2 = new ServiceController("Project2Service"); 
      sc2.ExecuteCommand(200); 

      //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; 
using System.Windows.Forms; 

namespace Project2Service 
{ 
    public partial class Service1 : ServiceBase 
    { 
     public enum commands 
     { 
      LogIt = 200 
     } 

     //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) 
     { 
      base.OnCustomCommand(command); 
      if (command == (int)commands.LogIt) 
      { 
       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"); 
       } 
      } 
     } 

     //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; 

     // } 
     //} 
    } 
} 
+1

我已经回答了这个在您的其他线程,让我寻找任何新的信息在这里 –

+0

给我你的项目adamt在微软,我会检查出来 –

+0

我将如何做到这一点@ AdamTuliper-MSFT –

回答

0

这里有几件事情: 1.检查您的服务正在运行的帐户。使用您的服务安装程序,您可以指定。我测试你的确切方案(使用代码)与系统,以确保我能在我的桌面上访问文件为日志测试,它工作得很好。 2.限制测试用例不要记录到孤立的,而是一个简单的文本文件日志。

我也贴,我用你的其他岗位代码 - 所以让我们打扫一下第一,并找出解决哪一个。

+0

我采取了这两种情况并实施它们。该服务运行的帐户是LocalSystem,我拿走了孤立的存储部分,并只写了一个文本文件WriteServiceInfo(“写入隔离存储的数据”),它就可以工作。将文件放入IsolatedStorage是个问题。自定义命令正在工作。 –

+0

Jusy好奇,系统权限和运行服务为什么你使用本地存储,而不是一个正常的文件?此外,如果您必须使用独立存储,请尝试将您的服务作为特定帐户运行。 –