将 kestrel 控制台的输出重定向到 richtextbox

Redirect the output of kestrel's console to richtextbox

好吧,我在本地的 Kestrel 服务器上有一个 api 运行ning,我需要 运行 它而不显示控制台,所以我使用了 superuser 的 vbs 答案它起作用了,现在我的问题是我想将控制台上显示的消息流出到其他地方,如文件或 windowsform 的 richtextbox,如果有任何原因? 谢谢

您可以将 Kestrel 的输出重定向到本地文件,然后您可以观察文件的变化。

重定向 Kestrel 输出的示例: dotnet run > d:\kestrel-output.txt

这是一个代码片段,用于查看文本文件的更改。这种方法使用时间间隔,但您可以尝试 FileSystemWatcher.

...
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        var cancellationTokenSource = new CancellationTokenSource();
        Load += (s, e) =>
        {
            const string targetFile = @"d:\kestrel-output.txt";
            _ = WatchTextFileAsync(targetFile,
                TimeSpan.FromSeconds(0.5),
                change =>
                {
                    Invoke(new Action(() =>
                        {
                            richTextBox1.AppendText(change);
                            richTextBox1.ScrollToCaret();
                        })
                    );
                },
                cancellationTokenSource.Token
            );
        };

        Closing += (s, e) =>
        {
            if (!e.Cancel)
                cancellationTokenSource.Cancel();
        };
    }

    public async Task WatchTextFileAsync(
        string path,
        TimeSpan checkInterval,
        Action<string> onChange,
        CancellationToken token = default)
    {
        var fs = File.Open(path, FileMode.OpenOrCreate, FileAccess.Read, FileShare.ReadWrite);
        fs.Seek(fs.Length, SeekOrigin.Begin); //ignore current content
        var sr = new StreamReader(fs);

        try
        {
            while (!token.IsCancellationRequested)
            {
                if (fs.Position > fs.Length) //new file? replaced? if so read from the beginning
                {
                    fs.Seek(0, SeekOrigin.Begin);
                }

                if (fs.Position < fs.Length) //check offset
                {
                    var change = await sr.ReadToEndAsync();
                    onChange?.Invoke(change);
                }

                await Task.Delay(checkInterval, token);
            }
        }
        finally
        {
            sr.Dispose();
            fs.Dispose();
        }
    }
}
...