C# 通过.Net core 3.1中的web浏览器公开控制台应用程序信息

C# 通过.Net core 3.1中的web浏览器公开控制台应用程序信息,c#,console-application,asp.net-core-3.1,C#,Console Application,Asp.net Core 3.1,我有一个很重的控制台应用程序,它执行多个线程,在不同的场景中读取、执行计算和写入输出。现在,我要简单地创建一种方法,让每个人都能够通过使用localhost或http/https的web浏览器访问数据(实时或近实时) 我也试过跟随。实际上,我已经环顾四周,找到了关于自托管的方法,但我真的不知道如何以一种简单的方式实现它 为了简洁起见,我添加了一个非常简单的控制台应用程序示例: using System; using System.Collections.Concurrent; using Sys

我有一个很重的控制台应用程序,它执行多个线程,在不同的场景中读取、执行计算和写入输出。现在,我要简单地创建一种方法,让每个人都能够通过使用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);
                }
            }
        }
    }
}
使用系统;
使用System.Collections.Concurrent;
使用系统线程;
名称空间控制台EAPP1
{
班级计划
{
公共静态int x=0;
公共静态int y=0;
公共静态int z=0;
公共静态ConcurrentDictionary值Dictionary=新建ConcurrentDictionary();
静态void Main(字符串[]参数)
{
//更新字典中的值的函数
线程createInputFileThread=新线程(()=>UpdateDictionaryThreadFunction(10000));
createInputFileThread.Start();
//如何在这里启动一个简单的web主机!
}
公共静态void UpdateDictionaryThreadFunction(int refreshTime)
{
while(true)
{
线程。睡眠(刷新时间);
如果(x<100000&&y<100000&&z<100000)
{
ValuesDictionary.AddOrUpdate(“ValueX”,x,(键,oldValue)=>oldValue+1);
ValuesDictionary.AddOrUpdate(“ValueY”,y,(键,oldValue)=>oldValue+2);
ValuesDictionary.AddOrUpdate(“ValueZ”,z,(键,oldValue)=>oldValue+3);
}
其他的
{
ValuesDictionary.AddOrUpdate(“ValueX”,x,(键,旧值)=>0);
ValuesDictionary.AddOrUpdate(“ValueY”,y,(键,旧值)=>0);
ValuesDictionary.AddOrUpdate(“ValueZ”,z,(键,旧值)=>0);
}
}
}
}
}
这里的目标是通过
localhost:someport
http://somename:someport
并获得如下信息:(值将每x秒刷新一次)

名称 价值 ValueX 34 瓦利 42 瓦卢兹 42
签出您使用的.net core的此类需求。。您需要在某个端口上提供TCP-IP服务的控制台应用程序。。我想说的一个最低限度的解决方案是将Kestrel链接到您的控制台应用程序,分配request receiver事件并在您的端口上启动它。。要重复刷新客户端,可以使用客户端本地JS和计时器。您的服务器可以为客户端的浏览器生成包含JS部分的常用HTML

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

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);
                }
            }
        }
    }
}


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

Signal在现有的web基础设施上工作,将数据推送到客户端。问题是如何添加一个简单的web UI-如何添加web基础结构这两个链接与您想要做的事情没有直接关系。如果要创建服务/守护进程,辅助服务非常有用。很可能您确实希望执行类似操作,并替换调用
UpdateDictionaryThreadFunction
的线程,但这无助于何时创建web应用程序。如果您检查由
dotnet new web
生成的代码,您可以看到可以创建一个最小的控制台应用程序来侦听返回原始字符串响应的eg GET。像那样编写HTML既困难又难看,尽管我会把应用程序从控制台上拆下来,让它成为一种服务。您可以将其耦合到不同的用户界面,如控制台或asp.net web应用程序。