2013-03-21 3 views
0

Я написал службу, и она отлично работает на моем компьютере, но когда я перемещаю ее на сервер, она должна работать, она выплевывает System.IndexOutOfRangeException всякий раз, когда он переходит к чтению/напишите файл, как его предполагалось. Мне просто кажется странным, что он делает это только на сервере, и я не знаю, как они работают по-другому с моим компьютером, поэтому любая помощь будет оценена по достоинству.Windows Server 2012 System.IndexOutOfRangeException

Описание: Процесс был прерван из-за необработанного исключения. Exception Информация: System.IndexOutOfRangeException Stack: на emlService.emlService.runProc() в System.Threading.ThreadHelper.ThreadStart_Context (System.Object) в System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext, система .Threading.ContextCallback, System.Object, Boolean) в System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) в System.Threading.ExecutionContext.Run (система .Threading.ExecutionContext, System.Threading.ContextCallback, System.Object) в 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 
} 

Unrelated на ваш вопрос, но мне интересно, как к тому, что вы думаете, что эффект lines.Select(c => c.ToString() есть. File.ReadAllLines() уже возвращает строковый массив, поэтому `Select (c => c.ToString()) является избыточным.

+0

Я исправил это другим способом, но я обязательно добавлю этот код в свой сервис, спасибо! Что касается ReadAllLines, я не знал, что это сработало, я только что получил сервис, и я буду оптимизировать его в течение следующих нескольких дней, я обязательно сделаю изменения там, спасибо! – user345453

2

На одной из ваших строк, которые вы читаете, линейная строка - это не та длина, которую вы ожидаете от нее.

Вы уверены, что это никогда не подведет?

linestring[17] 

Что делать, если в вашем файле есть пустая строка?

+0

Ах спасибо, это побудило меня посмотреть файлы, и они были на самом деле коррумпированы, спасибо! – user345453

Смежные вопросы