【问题标题】:TCP Receiver Service with Blazor Web Applicaiton带有 Blazor Web 应用程序的 TCP 接收器服务
【发布时间】:2021-03-07 19:40:17
【问题描述】:
我有一个 Blazor Web 应用程序,但需要一个接受 TCP 消息的后台服务。我之前创建了一个 Blazor 应用程序以及一个 TCP 发送方和接收方。但还没有把它们放在一起。
一般问题
如何使用 Blazor Web 应用实现 TCP 接收器?
具体问题
-
我是否将其注册为具有依赖注入的服务?据我所知,这些服务仅在需要时才被调用,而不是一直处于活动状态。
-
有没有可能,或者我需要创建两个单独的应用程序?
-
后台服务是否能够充当 TCP 接收器,从某种意义上说,它们一直在监视?我能否获取控制台应用程序代码并通过以下方式添加它:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.ConfigureServices(services =>
{
services.AddHostedService<TCPReceiver>();
});
- API 控制器端点可以充当 TCP 接收器还是必须通过 Rest 请求调用?
【问题讨论】:
标签:
c#
asp.net-core
.net-core
tcp
blazor
【解决方案1】:
如果您在自己的计算机上运行,那么可以,后台服务可以打开一个套接字并侦听 TCP 连接。如果您要发布到 Azure,这对于 TCP 服务来说似乎很可能,那么您必须将侦听器从网站中分离出来。 Azure 网站只能侦听标准端口(80 和 443),而这些端口由 Asp.Net 使用。
一个典型的 Asp.Net 入口点如下所示:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
调用IHostBuilder.Run() 实例化每个已注册IHostedService 的实例,启动它,等待用户尝试退出应用程序,然后在每个服务上调用stop。这是一个非常注入 TCP 监听器的好地方。
如果您确实需要在 Azure 中托管,则必须以不同的方式托管侦听器。有几个选项:
- Azure Service Fabric:Microsoft 推荐用于此类用例,但它的学习曲线相当高
- Azure 云服务:更易于实施,但已弃用。每个部署都需要分配一个虚拟机,因此发布、横向扩展等需要相当长的时间。
- Azure 容器实例:使用 DotNetCore,创建控制台应用程序、基于该应用程序创建容器映像以及在 Azure 中托管映像非常容易。不支持绿色/蓝色部署,您可以使用 Azure 流量管理器手动管理。
- Azure Kubernetes:我没有用过这个,因为它的学习曲线比较大,对于一个小项目我认为不值得。
您也可以在 AWS 中托管,但您必须自己搜索那里的托管选项,因为我没有这方面的经验。