我正在尝试使用 asp.net 核心构建一个小型 tcp 服务器/守护进程作为 Web 前端来与服务器交互。我发现 IHostedService/BackgroundService 似乎提供了一种将服务器和前端捆绑在一起的低成本替代方案。
目前代码看起来基本上是这样的(用于测试目的的回显服务器):
public class Netcat : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
TcpListener listener = new TcpListener(IPAddress.Any, 8899);
listener.Start();
while(!stoppingToken.IsCancellationRequested)
{
TcpClient client = await listener.AcceptTcpClientAsync();
NetworkStream stream = client.GetStream();
while (!stoppingToken.IsCancellationRequested)
{
byte[] data = new byte[1024];
int read = await stream.ReadAsync(data, 0, 1024, stoppingToken);
await stream.WriteAsync(data, 0, read, stoppingToken);
}
}
}
}
并在 Startup.cs 中初始化,如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddHostedService<Netcat>();
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
现代 Asp.Net 核心应用程序和守护进程应该如何合作有一个共同的模式吗?
我将如何从 Controller 与正在运行的服务本身进行交互?
IHostedService 是否甚至可用于此目的,或者它是完全分离 Asp.Net 前端和服务/服务器的更好方法,例如通过使用某种 IPC 机制将守护进程和 asp.net 作为单独的进程运行?