我正在为我的客户开始新项目。它将是一种带有 Web UI(很多很多用户)+ 桌面 UI(很少用户)的大型系统。
我想知道。我应该在 Windows 服务或 IIS 中托管我的所有逻辑吗?
该应用程序可以在后台执行许多操作(导入、导出、为报告准备数据)。Web 客户端(ASP.NET MVC)和桌面客户端(和其他客户端)将通过ServiceStack /WCF 与我的服务连接。
我正在为我的客户开始新项目。它将是一种带有 Web UI(很多很多用户)+ 桌面 UI(很少用户)的大型系统。
我想知道。我应该在 Windows 服务或 IIS 中托管我的所有逻辑吗?
该应用程序可以在后台执行许多操作(导入、导出、为报告准备数据)。Web 客户端(ASP.NET MVC)和桌面客户端(和其他客户端)将通过ServiceStack /WCF 与我的服务连接。
如果您使用ServiceStack ,您可以在同一个 ASP.NET Web 应用程序中托管您的Web 服务 API 和后台服务。ServiceStack 对这个故事有一些很好的支持,如果你有一个IMessageService
注册的,所有 OneWay Async HTTP 调用都会自动延迟并发布到注册的 MQ 服务(例如,对于 Redis MQ,请求 DTO 会在服务 MQ 收件箱中发布)。
由于使用 ASP.NET 应用程序部署 ASP.NET 主机比使用 Windows 服务更容易,因此在StackOverflow Careers中,我们选择将 BackOffice 服务拆分为单独的 ASP.NET Web 应用程序(这不是公开的)。
对于单向消息,面向 Internet 的职业网站将 Request DTO 放入 Redis,由ServiceStack 的 Redis MQ 服务器处理。对于正常的回复服务,我们能够重用 Request DTO 并使用类型化的 C# Service Clients直接调用 ServiceStack Web Services 。
使用 ServiceStack 的好处之一是内置的消息传递 API能够重用您现有的 Web 服务,因此我们能够获得消息传递的优势,而无需开发特定的仅 MQ 服务。
由于在 ASP.NET 主机中运行的后台线程更加不稳定,我们将其添加到 Global.asax 中以mqHost.Start()
在每个请求结束时调用,如果它因任何原因被终止,它将启动 MQ 服务器主线程:
protected void Application_EndRequest(object sender, EventArgs e)
{
//If the MQ Host goes down for whatever reason, restart it
if (appHost == null) return;
var mqHost = appHost.TryResolve<IMessageService>();
if (mqHost != null)
mqHost.Start();
}
这通常是 No-Op,但如果主后台线程因任何原因被杀死,它将再次启动它。
以 Windows 服务运行它可能是后台服务的理想环境,因为它不受 AppDomain 重新启动和 ASP.NET 请求限制的影响。部署和调试 Windows 服务更难,而且它们不是跨平台的,所以我通常会避免使用它们,除非需要它们。但如果你想走这条路,你应该查看 ServiceStack 的 Windows 服务演示项目:
我愿意:
从 WCF 服务访问的业务逻辑(http、tcp,无论您的要求是什么)
Windows 服务是否用于多线程的繁重后台任务(解析巨大的 xml 文档,从文件中提取大数据,耗时的系统集成等......)
UI 处理通过 http 请求和响应的轻型后台任务(使用 asp.net mvc 消耗 WCF 服务或执行 UI Stuff)