将.NET Core控制台应用程序作为服务运行还是重做?

时间:2020-10-26 16:53:32

标签: c# .net-core windows-server

我们有来自第三方编码的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();
        }

    }

}

我看过几篇类似的文章,但不确定应该朝哪个方向发展。任何方向将不胜感激!

1 个答案:

答案 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