Server 2008上的Windows filewatcher服务崩溃

问题描述:

我制作了一个filewatcher服务,该服务读取放入目录中的每个XML文件并在标签上打印内容(Visual Studio 2012,Report viewer 2010)。服务在Windows 8上正常工作,但在服务器2008 R2上,每当我复制目录中的文件时,都会发生崩溃。Server 2008上的Windows filewatcher服务崩溃

public partial class MyService : ServiceBase 
{ 
    public MyService() 
    { 

     InitializeComponent(); 

     GetSourcePath(); 
    } 

    private void GetSourcePath() 
    { 
     RegistryKey myKey = Registry.LocalMachine.OpenSubKey("SOFTWARE\\Company\\MyService", false); 
     if (myKey == null) 
     { 
      fsw.Path = @"C:\Source\"; 
     } 
     else 
     { 
      fsw.Path = (string)myKey.GetValue("SourcePath"); 
     } 
    } 

    protected override void OnStart(string[] args) 
    { 
     base.OnStart(args); 
     fsw.EnableRaisingEvents = true; 
    } 

    protected override void OnPause() 
    { 
     base.OnPause(); 
     fsw.EnableRaisingEvents = false; 
    } 


    protected override void OnContinue() 
    { 
     base.OnContinue(); 
     GetSourcePath(); 
     fsw.EnableRaisingEvents = true; 
    } 

    private void fsw_Created(object sender, FileSystemEventArgs e) 
    { 
     System.Threading.Thread.Sleep(2000); 

     ReportViewer reportViewer = new ReportViewer(); 

     reportViewer.ProcessingMode = ProcessingMode.Local; 
     reportViewer.LocalReport.ReportPath = @"rptLabel.rdlc"; 
     reportViewer.LocalReport.DataSources.Add(new ReportDataSource("DataSet", PrintLabel.GetPrintLabels(e.FullPath))); 
     reportViewer.RefreshReport(); 

     AutoPrint.Export(reportViewer.LocalReport); 
     AutoPrint.Print(); 
    } 

    protected override void OnStop() 
    { 
     fsw.EnableRaisingEvents = false; 
    } 

} 

这里为其他类

public class AutoPrint 
{ 
    private static int m_currentPageIndex; 
    private static IList<Stream> m_streams; 

    public static Stream CreateStream(string name, string fileNameExtension, Encoding encoding, string mimeType, bool willSeek) 
    { 
     Stream stream = new MemoryStream(); 
     m_streams.Add(stream); 
     return stream; 
    } 


    public static void Export(LocalReport report) 
    { 
     string deviceInfo = 
      @"<DeviceInfo> 
      <OutputFormat>EMF</OutputFormat> 
      <PageWidth>10cm</PageWidth> 
      <PageHeight>4cm</PageHeight> 
      <MarginTop>0</MarginTop> 
      <MarginLeft>0</MarginLeft> 
      <MarginRight>0</MarginRight> 
      <MarginBottom>0</MarginBottom> 
     </DeviceInfo>"; 

     Warning[] warnings; 
     m_streams = new List<Stream>(); 

     try 
     { 
      report.Render("Image", deviceInfo, CreateStream, out warnings); 
     } 
     catch (Exception exc) 
     { 
      System.Diagnostics.EventLog.WriteEntry("My Service", DateTime.Now.ToLongTimeString() + " Error rendering print : " + exc.Message); 
      foreach (Stream stream in m_streams) 
      { 
       stream.Position = 0; 
      } 
     } 

    } 

    public static void Print() 
    { 
     PrintDocument printDoc = new PrintDocument(); 

     if(printDoc.PrinterSettings.IsDefaultPrinter) printDoc.PrinterSettings.PrinterName = "Printer Name"; 

     if (m_streams == null || m_streams.Count == 0) System.Diagnostics.EventLog.WriteEntry("MyService", DateTime.Now.ToLongTimeString() + " Error: no stream to print."); 

     if (!printDoc.PrinterSettings.IsValid) 
     { 
      System.Diagnostics.EventLog.WriteEntry("MyService", DateTime.Now.ToLongTimeString() + " Error: cannot find the default printer."); 
     } 
     else 
     { 
      printDoc.PrintPage += new PrintPageEventHandler(PrintPage); 
      m_currentPageIndex = 0; 
      printDoc.Print(); 
     } 
    } 

    public static void PrintPage(object sender, PrintPageEventArgs ev) 
    { 

     try 
     { 
      Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]); 

      // Adjust rectangular area with printer margins. 
      Rectangle adjustedRect = new Rectangle(
       ev.PageBounds.Left - (int)ev.PageSettings.HardMarginX, 
       ev.PageBounds.Top - (int)ev.PageSettings.HardMarginY, 
       ev.PageBounds.Width, 
       ev.PageBounds.Height); 

      // Draw a white background for the report 
      ev.Graphics.FillRectangle(Brushes.White, adjustedRect); 

      // Draw the report content 
      ev.Graphics.DrawImage(pageImage, adjustedRect); 

      // Prepare for the next page. Make sure we haven't hit the end. 
      m_currentPageIndex++; 
      ev.HasMorePages = (m_currentPageIndex < m_streams.Count); 
     } 
     catch (Exception exc) 
     { 
      System.Diagnostics.EventLog.WriteEntry("MyService", DateTime.Now.ToLongTimeString() + " Error rendering print page: " + exc.Message + "Inner exception :" + exc.InnerException); 
     } 

    } 

} 

还有一个静态类printLabel的DATAS,但没有什么有趣的这种情况下的代码。它只加载数据。 这里是从日志事件

应用所述第一错误消息:MyService.exe Framework版本:v4.0.30319 描述:过程终止由于未处理的异常。 异常信息信息:System.IO.FileNotFoundException 堆栈: 在MyService.MyService.fsw_Created(System.Object的,System.IO.FileSystemEventArgs) 在System.IO.FileSystemWatcher.OnCreated(System.IO.FileSystemEventArgs) 的系统。 IO.FileSystemWatcher.NotifyFileSystemEventArgs(的Int32,System.String) 在System.IO.FileSystemWatcher.CompletionStatusChanged(UInt32的,UInt32的,System.Threading.NativeOverlapped *) 在System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32的,UInt32的,的System.Threading .NativeOverlapped *)

此处来自事件日志的第二条消息

错误的应用程序名:MyService.exe,版本:1.0.0.0,时间戳:0x51349c1b 错误模块名称:KERNELBASE.dll,版本:6.1.7601.17932,时间戳:0x50327672 异常代码:0xe0434352 故障偏移:0x0000c41f 断裂作用进程ID:0x2dc4 错误应用程序开始时间:0x01ce18d947393653 错误的应用程序路径:C:\ Program Files文件(x86)\ Company \ MyService \ MyService.exe 错误模块路径:C:\ Windows \ syswow64 \ KERNELBASE.dll 报告ID :a27c24e2-84cc-11e2-bb34-0019992623e2

我做了与控制台相同的应用程序,它完美的工作。也许该服务没有权利rea d文件?我有人有一个想法...

你得到FileNotFoundException,你正在使用相对路径。这意味着最可能的问题是你有错误的工作目录。尝试使用绝对路径。

一些更多的信息,请参阅What directory does a Windows Service run in?

我发现这个问题。它是reportviewer 2010.在安装ReportViewer Service Pack 1之后,似乎他不再崩溃。发生崩溃与线:

ReportViewer reportViewer = new ReportViewer(); 

我也改变了这一行:

reportViewer.LocalReport.ReportEmbeddedResource = "MyService.rptLabel.rdlc";