首页 > 解决方案 > 通过 .Net core 3.1 中的 Web 浏览器公开控制台应用程序信息

问题描述

我有一个重型控制台应用程序,它执行多个线程,这些线程在不同场景中读取、执行计算和写入输出。现在我正在尝试简单地创建一种方式,让每个人都能够使用 localhost 或 http/https 通过 Web 浏览器访问数据(实时或近实时)。

我试过关注这个资源以及这个其他的。我实际上环顾四周,发现了自托管,但我真的不知道如何以简单的方式实现它。

为简洁起见,我添加了一个非常简单的控制台应用程序示例:

using System;
using System.Collections.Concurrent;
using System.Threading;

namespace ConsoleApp1
{
    class Program
    {
        public static int x = 0;
        public static int y = 0;
        public static int z = 0;
        public static ConcurrentDictionary<String, int> ValuesDictionary = new ConcurrentDictionary<string, int>();

        static void Main(string[] args)
        {
            //Function that updates the values in the dictionary
            Thread createInputFileThread = new Thread(() => UpdateDictionaryThreadFunction(10000));
            createInputFileThread.Start();

            //How to start a simple web host here!
        }

        public static void UpdateDictionaryThreadFunction(int refreshTime)
        {
            while (true)
            {
                Thread.Sleep(refreshTime);
                if (x < 100000 && y < 100000 && z < 100000)
                {
                    ValuesDictionary.AddOrUpdate("ValueX", x, (key, oldValue) => oldValue + 1);
                    ValuesDictionary.AddOrUpdate("ValueY", y, (key, oldValue) => oldValue + 2);
                    ValuesDictionary.AddOrUpdate("ValueZ", z, (key, oldValue) => oldValue + 3);
                }
                else
                {
                    ValuesDictionary.AddOrUpdate("ValueX", x, (key, oldValue) => 0);
                    ValuesDictionary.AddOrUpdate("ValueY", y, (key, oldValue) => 0);
                    ValuesDictionary.AddOrUpdate("ValueZ", z, (key, oldValue) => 0);
                }
            }
        }
    }
}

这里的目标是通过类似的东西访问 ValuesDictionary 中的数据,localhost:someporthttp://somename:someport获得类似的东西:(这些值将每 x 秒刷新一次)

姓名 价值
价值X 34
价值Y 42
价值Z 42

标签: c#console-applicationasp.net-core-3.1

解决方案


您使用.net core..您想要一个在某个端口上提供 TCP-IP 的控制台应用程序.. 我想说的最小解决方案是将 Kestrel 链接到您的控制台应用程序,分配请求接收器事件并在您的端口上启动它。 . 要反复刷新客户端,您可以使用带有计时器的客户端本地 JS。您的服务器可以为客户端的浏览器生成包含该 JS 部分的常用 HTML。

在控制台应用程序中使用 Kestrel 的示例:

https://jonhilton.net/2016/07/18/your-first-net-core-web-application-using-nothing-but-the-command-line/

注意:这是一个老式的“快速解决方案”。同样使用 Kestrel,最好先将您的应用程序构建为报告服务,独立于平台选择。然后,您可以在将来可能需要使用的任何平台(SignalR、Blazor、ASP、Azure 等)中“插入”该代码


推荐阅读