我正在为我的客户开始新项目。它将是一种具有Web UI(许多用户)+桌面UI(少数用户)的大型系统。
我在想。我应该在Windows服务或IIS中托管我的所有逻辑吗?
应用程序可以在后台执行许多操作(导入,导出,为报告准备数据)。 Web客户端(ASP.NET MVC)和桌面客户端(以及其他客户端)将通过ServiceStack / WCF与我的服务连接。
答案 0 :(得分:2)
如果您使用ServiceStack,则可以在同一个ASP.NET Web应用程序中托管Web service APIs and Background Services。 ServiceStack对这个故事提供了一些很好的支持,如果你注册了IMessageService
,所有OneWay异步HTTP调用都会自动延迟并发布到已注册的MQ服务(例如,对于Redis MQ,请求DTO将在服务MQ中发布收件箱)。
由于使用ASP.NET应用程序而不是Windows服务更容易部署ASP.NET主机,因此StackOverflow Careers我们选择将BackOffice服务拆分为单独的ASP.NET Web应用程序(即不公开)。
对于单向消息,面向Careers网站的互联网会将请求DTO放入Redis,由ServiceStack's Redis MQ Server处理。对于普通回复服务,我们可以重新使用请求DTO并使用typed C# Service Clients之一直接调用ServiceStack Web服务。
使用ServiceStack的一个好处是built-in Messaging API能够重用现有的Web服务,因此我们无需开发特定的MQ服务即可获得advantages of messaging
由于在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服务演示项目:
答案 1 :(得分:1)
我做:
从WCF服务(http,tcp,无论您的要求是什么)访问的业务逻辑
Windows服务用于繁重的后台任务或多线程(解析大型xml文档,从文件中提取大数据,耗时的系统集成等等)
用于处理通过http请求和响应的轻量级后台任务的UI(使用asp.net mvc消耗WCF服务或执行UI Stuff)