我们有来自第三方编码的UTF-16 LE的订单。我们的ERP只能读取UTF-8编码。因此,我创建了.NET Core控制台应用程序,该应用程序监视订单到达的目录并将其写入ERP抓取文件的位置。如何让它在我们的Windows Server 2016上运行?我应该将其剪贴并作为Windows服务写入吗?
using System;
using System.IO;
public class RewriteUsingUTF8
{
public static void Main()
{
string ordrstkPath = @"\\Rep-app\sftp_root\supplypro\ordrstk";
string conrstkPath = @"\\Rep-app\sftp_root\supplypro\Conrstk";
Watch(ordrstkPath);
Watch(conrstkPath);
Console.ReadLine();
}
private static void Watch(string path)
{
//initialize
FileSystemWatcher watcher = new FileSystemWatcher();
//assign parameter path
watcher.Path = path;
//create event
watcher.Created += FileSystemWatcher_Created;
watcher.NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.Size | NotifyFilters.Attributes;
//only look for csv
watcher.Filter = "*.csv";
// Begin watching.
watcher.EnableRaisingEvents = true;
}
// method when event is triggered (file is created)
private static void FileSystemWatcher_Created(object sender, FileSystemEventArgs e)
{
ReadWriteStream(e.FullPath, e.Name);
}
private static void ReadWriteStream(string path, string fileName)
{
FileStream originalFileStream = new FileStream(path, FileMode.Open, FileAccess.Read);
//destination path by replacing SFTP user directory
string destinationPath = path.Replace(@"\supplypro\", @"\ftpuser\");
FileStream destinationFileStream = new FileStream(destinationPath, FileMode.Create, FileAccess.Write);
StreamReader streamReader = new StreamReader(originalFileStream);
StreamWriter streamWriter = new StreamWriter(destinationFileStream);
string currentLine;
try
{
currentLine = streamReader.ReadLine();
while (currentLine != null)
{
streamWriter.WriteLine(currentLine);
currentLine = streamReader.ReadLine();
}
//archive path
string archivePath = path.Replace(fileName, @"\archive\" + fileName);
//move to archive path
File.Move(path, archivePath);
}
catch (Exception e)
{
//error path
string errorPath = path.Replace(fileName, @"\error\" + fileName);
//move to error path
File.Move(path, errorPath);
//need to write code for error to write to event viewer
Console.WriteLine("Exception: " + e.Message);
}
finally
{
//dispose resources
streamReader.Close();
streamWriter.Close();
originalFileStream.Close();
destinationFileStream.Close();
}
}
}
我看过几篇类似的文章,但不确定应该朝哪个方向发展。任何方向将不胜感激!
答案 0 :(得分:0)
听起来像我们在非常相似的环境中工作。我们开始使用控制台应用程序进行ERP集成。它们的主要缺点是它们在用户的桌面上运行,因此您必须以该用户的身份RDP来管理它们,并且如果服务器重新启动,它们不会自动重新启动。我一直在将它们全部转换为Windows服务。 .NET Core使其相当容易。
蒂姆·科里(Tim Corey)精彩的视频介绍了如何编写Windows services in .NET Core 3。他谈到在部署新版本时删除和重新创建服务,但我认为没有必要。只需加入RDP,请停止服务,以使所有文件都没有被使用,部署并重新启动。它不像重新部署.NET Core Web应用程序那样简单,该应用程序可以为您管理所有停止和重新启动,但是还不错。
要了解的关键一点是,绝对不能将异常传播到Worker.ExecuteAsync
外。它们不会在任何地方处理,Windows会在未运行时将您的服务显示为正在运行。无论您在ExecuteAsync
中做什么,都应在捕获所有异常并保持运行的循环中进行。
文件监视程序看似复杂。确保您正在侦听错误事件。例如,如果您正在观看网络共享并且该网络共享不可用,则FileSystemWatcher
将发出错误消息,并且当共享重新联机时,不会恢复工作。不过,我还没有找到处理错误的最佳方法。我认为要使其可靠,需要在出现任何错误后更换FileSystemWatcher
。