我已经编写了一个服务,它在我的计算机上运行良好,但是当我将它移到它应该运行的服务器上时,它会吐出 System.IndexOutOfRangeException 每当它像它应该的那样读/写文件时。我只是觉得它只在服务器上这样做很奇怪,而且我不知道它们与我的计算机的工作方式有何不同,因此将不胜感激。
说明:进程因未处理的异常而终止。异常信息:System.IndexOutOfRangeException 堆栈:在 emlService.emlService.runProc() 在 System.Threading.ThreadHelper.ThreadStart_Context(System.Object) 在 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 在 System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean) 在 System.Threading.ExecutionContext.Run(System.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;
}
}
}
}