我的应用程序是一个Windows服务(Worker Services),我需要添加一个Web应用程序来管理和监视Windows服务的任务。
Product _______ Windows Service
\______ WebApp
为了便于部署,最好只安装 Windows 服务,并且该服务本身在默认(但可配置)端口中托管 Web 应用程序。因此无需单独部署 Web 应用程序。
我使用 .net 技术和 Windows 平台(Windows 服务、Worker Services、Asp.net Core、Blazor WebApp)。您对在 .net 世界中处理此部署架构有什么建议。
在 WindowsService 中托管 Web 应用程序的最佳方式(Worker 服务)。
我使用 .net 技术和 Windows 平台(Windows 服务、Worker 服务、Asp.net Core、Blazor WebApp)。你有什么建议 在.net世界中处理这个部署架构
虽然很难明确做出最终决定,因为它通常取决于场景和要求。尽管如此,有几种方法可以实现您想要实现的目标,因此您必须决定哪一种最适合或满足您的要求。
通常,直接在 Windows 服务(Worker Service)内托管 Web 应用程序有一些潜在的好处,但出于安全性、可维护性和可扩展性的原因,通常不建议这样做。
因此,牢记上述考虑,您可以尝试以下任一方法。
首先,流行的方法之一可能是将 ASP.NET Core 中间件集成到 Worker Service 中,因为将 ASP.NET Core 中间件集成到 Worker Service 涉及到将 Web 应用程序的中间件合并到 Worker Service 的执行管道中。
这提供了诸如更高的灵活性、精确的控制和潜在的性能改进等优势。
例如,您可以使用中间件 DI 直接注入您的工作服务。让我们考虑以下示例:
public class MyWorkerService : IHostedService
{
private readonly IWebHost _webHost;
public MyWorkerService(IWebHostBuilder builder)
{
_webHost = builder.Build();
}
public Task StartAsync(CancellationToken cancellationToken)
{
_webHost.StartAsync(cancellationToken);
return Task.CompletedTask;
}
public Task StopAsync(CancellationToken cancellationToken)
{
return _webHost.StopAsync(cancellationToken);
}
}
最后,您可以按如下方式注册您的 DI:
builder.Services.AddHttpClient<MyWorkerService>();
但是,缺点包括更复杂的实现以及需要手动管理 HTTP 请求和响应。
注意: 此方法非常适合未暴露在公共互联网上的内部管理和监控应用程序。
您可以考虑的另一种方法是将工作服务和 Web 应用程序分开,包括在 IIS 上独立部署 Web 应用程序或使用 Kestrel 自托管。
这种方法提供了可扩展性优势,并允许为 Web 应用程序采取专门的安全措施。
但是,它也有一些缺点,包括更复杂的部署过程以及可能会增加 Worker Service 和 Web 应用程序之间的通信开销。
另一个好的方法是,分离 ASP.NET Core WebApp 或 Blazor WebAssembly 带来的优势包括清晰的关注点分离、专用的 Web 服务器功能、更容易的扩展和标准化的安全协议。
但是,这种方法需要不同的部署和管理流程。在用于多功能 Web 应用程序的 ASP.NET Core 和用于单页应用程序的 Blazor WebAssembly 之间进行选择应基于特定的项目要求和偏好。
注意: 如前所述,很难推荐任何特定的方法,因为它完全依赖于场景、要求和偏好。您可以参考这个官方文档,这样您可能会获得更多想法。