运行 .NET Core 控制台应用即服务,还是重做?
Running .NET Core console app as a service, or redo?
我们有来自第三方编码的 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();
}
}
}
我看过一些类似的帖子,但不确定我应该采取什么方向。任何方向将不胜感激!
听起来我们在非常相似的环境中工作。我们开始使用控制台应用程序进行 ERP 集成。它们的主要缺点是它们 运行 在用户的桌面上,因此您必须以该用户的身份使用 RDP 来管理它们,并且它们不会在服务器重新启动时自动重新启动。我一直在将它们全部转换为 Windows 服务。 .NET Core 让它变得相当简单。
Tim Corey 有一个关于如何写作的精彩视频 Windows services in .NET Core 3。他谈到在部署新版本时删除并重新创建服务,但我认为没有必要。只需 RDP,停止服务,以便 none 的文件在使用中,部署并重新启动它。它不像重新部署 .NET Core Web 应用程序那样简单,它会为您管理所有停止和重新启动,但还不错。
要知道的一件重要事情是异常绝对不能传播到 Worker.ExecuteAsync
之外。它们不会在任何地方被处理,并且 Windows 会将您的服务显示为 运行ning 而不是。无论你在 ExecuteAsync
中做什么,都在一个循环中进行,该循环捕获所有异常并保持 运行ning.
文件观察器看似复杂。确保您正在侦听错误事件。例如,如果您正在观看网络共享并且它变得不可用,则 FileSystemWatcher
将发出错误并且将 not 在共享重新联机时恢复工作。不过,我还没有想出处理错误的最佳方法。我认为使其可靠需要在出现任何错误后更换 FileSystemWatcher
。
我们有来自第三方编码的 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();
}
}
}
我看过一些类似的帖子,但不确定我应该采取什么方向。任何方向将不胜感激!
听起来我们在非常相似的环境中工作。我们开始使用控制台应用程序进行 ERP 集成。它们的主要缺点是它们 运行 在用户的桌面上,因此您必须以该用户的身份使用 RDP 来管理它们,并且它们不会在服务器重新启动时自动重新启动。我一直在将它们全部转换为 Windows 服务。 .NET Core 让它变得相当简单。
Tim Corey 有一个关于如何写作的精彩视频 Windows services in .NET Core 3。他谈到在部署新版本时删除并重新创建服务,但我认为没有必要。只需 RDP,停止服务,以便 none 的文件在使用中,部署并重新启动它。它不像重新部署 .NET Core Web 应用程序那样简单,它会为您管理所有停止和重新启动,但还不错。
要知道的一件重要事情是异常绝对不能传播到 Worker.ExecuteAsync
之外。它们不会在任何地方被处理,并且 Windows 会将您的服务显示为 运行ning 而不是。无论你在 ExecuteAsync
中做什么,都在一个循环中进行,该循环捕获所有异常并保持 运行ning.
文件观察器看似复杂。确保您正在侦听错误事件。例如,如果您正在观看网络共享并且它变得不可用,则 FileSystemWatcher
将发出错误并且将 not 在共享重新联机时恢复工作。不过,我还没有想出处理错误的最佳方法。我认为使其可靠需要在出现任何错误后更换 FileSystemWatcher
。