我正在为我的客户开始一个新项目。这将是一个Web UI(很多用户)+桌面用户界面(很少用户)的大型系统。Windows服务或IIS中的主机应用程序服务器?
我想知道。我应该将所有的逻辑托管在Windows服务或IIS中吗?
该应用程序可以在后台执行许多操作(导入,导出,为报表准备数据)。 Web客户端(ASP.NET MVC)和桌面客户端(以及其他客户端)将通过ServiceStack/WCF与我的服务连接。
我正在为我的客户开始一个新项目。这将是一个Web UI(很多用户)+桌面用户界面(很少用户)的大型系统。Windows服务或IIS中的主机应用程序服务器?
我想知道。我应该将所有的逻辑托管在Windows服务或IIS中吗?
该应用程序可以在后台执行许多操作(导入,导出,为报表准备数据)。 Web客户端(ASP.NET MVC)和桌面客户端(以及其他客户端)将通过ServiceStack/WCF与我的服务连接。
我做的:从WCF服务访问
业务逻辑(HTTP,TCP,无论你的需求)
的Windows服务,用于多线程或不重后台任务(解析巨大的XML文档,提取文件的大数据,耗时系统integraction等等等...)
UI处理光后台任务要求,并通过HTTP responsed(使用asp.net mvc的消费WCF服务或做UI的东西)
如果您使用ServiceStack,则可以将您的Web service APIs and Background Services托管在同一个ASP.NET Web应用程序中。 ServiceStack为这个故事提供了很好的支持,如果你注册了IMessageService
,所有OneWay Async HTTP调用都会自动推迟并发布到已注册的MQ服务(例如,对于Redis MQ,请求DTO将在服务MQ收件箱中发布)。
由于ASP.NET的部署主机更容易做比Windows服务的ASP.NET应用程序,在StackOverflow Careers我们选择了分裂的BackOffice服务到一个单独的ASP.NET Web应用程序(这不是公开可用的)。
对于单向消息,互联网面临的职位网站丢弃请求DTOs到Redis处理ServiceStack's Redis MQ Server。对于普通回复服务,我们可以重新使用Request DTO,并使用typed C# Service Clients之一直接调用ServiceStack Web服务。
使用ServiceStack的好处之一是built-in Messaging API能够重新使用您现有的Web服务,因此我们能够获得advantages of messaging而无需开发特定的仅限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();
}
这通常是无操作,但如果主后台线程被杀害以任何理由将再次启动自己。在Windows服务