Windows Server 2012 System.IndexOutOfRangeException
我已经写了一个服务,它在我的电脑上工作得很好,但是当我将它移动到服务器上时,它应该运行,它随时都会吐出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;
}
}
}
}
据我所知,你是不是检查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())是多余的。
在你读的一行代码中,linestring并不是你期望的长度。
你确定这永远不会失败吗?
linestring[17]
如果您的文件中有空行,该怎么办?
啊谢谢,这促使我看看这些文件,他们实际上是腐败的,谢谢! – user345453 2013-03-22 00:05:22
我以另一种方式解决了这个问题,但我一定会将此代码添加到我的服务中,谢谢!至于ReadAllLines,我不知道它是这样工作的,我只是终于得到了服务的工作,并将在未来几天内优化它,我一定会在那里做出改变,谢谢! – user345453 2013-03-22 00:06:24