2013-03-21 140 views
0

我已经写了一个服务,它在我的电脑上工作得很好,但是当我将它移动到服务器上时,它应该运行,它随时都会吐出System.IndexOutOfRangeException,写文件就像它的假设一样。我只是觉得奇怪,它只是在服务器上这样做,我不知道他们如何以不同的方式对我的电脑工作,所以任何帮助,将不胜感激。Windows Server 2012 System.IndexOutOfRangeException

描述:由于未处理的异常,进程终止。 异常信息:System.IndexOutOfRangeException 堆栈: 在emlService.emlService.runProc() 在System.Threading.ThreadHelper.ThreadStart_Context(System.Object的) 在System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext,系统.Threading.ContextCallback,System.Object,Boolean) at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext,System.Threading.ContextCallback,System.Object,Boolean) at System.Threading.ExecutionContext.Run(System .Threading.ExecutionContext,System.Threading.ContextCallback,System.Object) at System.Threading.ThreadHelper.ThreadStart()

代码

public partial class emlService : ServiceBase 
{ 
    Boolean _isRunning; 

    public emlService() 
    { 
     InitializeComponent(); 
     if (!System.Diagnostics.EventLog.SourceExists("emlServiceSource")) 
     { 
      System.Diagnostics.EventLog.CreateEventSource(
       "emlServiceSource", "emlServiceLog"); 
     } 
     eventLog1.Source = "emlSerivceSource"; 
     eventLog1.Log = "emlServiceLog"; 
    } 

    protected override void OnStart(string[] args) 
    { 
     eventLog1.WriteEntry("In OnStart"); 
     Thread NewThread = new Thread(new ThreadStart(runProc)); 
     _isRunning = true; 
     //Creates bool to start thread loop 
     if (_isRunning) 
     { 
      NewThread.Start(); 
     } 
    } 

    protected override void OnStop() 
    { 
     eventLog1.WriteEntry("In OnStop"); 
     _isRunning = false;    
    } 

    protected override void OnContinue() 
    {    
    } 

    public void runProc() 
    {   

     //Directory of the drop location 
     string tempDrop = ConfigurationSettings.AppSettings["conf_drop"]; 
     DirectoryInfo drop = new DirectoryInfo(tempDrop); 

     //Directory of the pickup location 
     string tempPickup = ConfigurationSettings.AppSettings["conf_pickup"]; 
     string destpath = tempPickup; 

     //Inits ParserCommands and DropDirectory object 
     ParserCommands parserObject = new ParserCommands(); 

     //Inits array to hold number of messages in drop location 
     FileInfo[] listfiles; 

     //Inits CFG 
     string conf_mailsender = ConfigurationSettings.AppSettings["conf_mailsender"]; 
     string conf_rcpt = ConfigurationSettings.AppSettings["conf_rcpt"]; 
     string conf_username_and_password = ConfigurationSettings.AppSettings["conf_username_and_password"]; 
     string conf_sender = ConfigurationSettings.AppSettings["conf_sender"]; 
     string conf_raport = ConfigurationSettings.AppSettings["conf_raport"]; 

     //Loop that never ends 
     while (true) 
     { 
      //Reduces load on machine 
      Thread.Sleep(1000); 

      //Checks if there is a message waiting to be processed and begins processing if so 
      listfiles = drop.GetFiles(); 
      if (listfiles.Length >= 1) 
      { 
       for (int j = 0; j <= (listfiles.Length - 1); j++) 
       { 
        //Gives it time to breathe 
        Thread.Sleep(250); 

        try 
        { 
         //Gets each line of the original .eml into a string array 
         var lines = File.ReadAllLines(listfiles[j].FullName); 
         string[] linestring = lines.Select(c => c.ToString()).ToArray(); 

         //Seperates start of email from the rest and decode parameter_content 
         string parameter_to = parserObject.getReciever(linestring[12]); 
         string parameter_content = parserObject.DecodeFrom64(linestring[17]); 

         //Creates string ready for base64 encode 
         string encode = "from=" + conf_sender + "&to=" + parameter_to + "&raport=" + conf_raport + "&message=" + parameter_content; 

         //Opens up steam and writer in the new dest, creates new .eml file 
         using (FileStream fs = new FileStream(destpath + listfiles[j].Name, FileMode.CreateNew)) 
         using (StreamWriter writer = new StreamWriter(fs)) 
         { 

          //Writes all .eml content into buffer 
          writer.WriteLine("x-sender: " + conf_mailsender); 
          writer.WriteLine("x-receiver: " + conf_rcpt); 
          writer.WriteLine(linestring[2]); 
          writer.WriteLine(linestring[3]); 
          writer.WriteLine(linestring[4]); 
          writer.WriteLine(linestring[5]); 
          writer.WriteLine(linestring[6]); 
          writer.WriteLine(linestring[7]); 
          writer.WriteLine(linestring[8]); 
          writer.WriteLine("From: " + conf_mailsender); 
          writer.WriteLine(linestring[10]); 
          writer.WriteLine("Reply-To: " + conf_mailsender); 
          writer.WriteLine("To: " + conf_rcpt); 
          writer.WriteLine("Subject: " + conf_username_and_password); 
          writer.WriteLine("Return-Path: " + conf_mailsender); 
          writer.WriteLine(linestring[15]); 
          writer.WriteLine(); 

          //Writes encoded string into buffer 
          writer.WriteLine(parserObject.EncodeTo64(encode)); 

          //Writes buffer into .eml file 
          writer.Flush(); 
         } 

         lines = null; 
        } 
         catch (System.IO.IOException e) 
        { 
         Console.WriteLine("no"); 

        } 

        //Deletes the file 
        File.Delete(listfiles[j].FullName); 
       } 

       //Sets the number of files needing sent to 0 
       listfiles = null; 
      } 
     } 
    } 
} 

回答

3

据我所知,你是不是检查linestring长度的任何地方。我不能肯定地说,因为你没有提供足够的信息,但我会认为linestring.Length小于17,导致parserObject.DecodeFrom64(linestring[17]);抛出异常。这可能是因为linestring.Length小于12,并且它是在此之前的行。

要解决这个问题,您应该检查linestring的长度并适当处理结果。

string[] linestring = lines.Select(c => c.ToString()).ToArray(); 
if(linestring.Length <= 17) 
{ 
    //handle malformed file 
} 
else 
{ 
    //complete the processing 
} 

无关你的问题,但我很好奇,你怎么想的lines.Select(c => c.ToString()效果。 File.ReadAllLines()已经返回一个字符串数组,所以`Select(c => c.ToString())是多余的。

+0

我以另一种方式解决了这个问题,但我一定会将此代码添加到我的服务中,谢谢!至于ReadAllLines,我不知道它是这样工作的,我只是终于得到了服务的工作,并将在未来几天内优化它,我一定会在那里做出改变,谢谢! – user345453 2013-03-22 00:06:24

2

在你读的一行代码中,linestring并不是你期望的长度。

你确定这永远不会失败吗?

linestring[17] 

如果您的文件中有空行,该怎么办?

+0

啊谢谢,这促使我看看这些文件,他们实际上是腐败的,谢谢! – user345453 2013-03-22 00:05:22