1

我正在为我的客户开始一个新项目。这将是一个Web UI(很多用户)+桌面用户界面(很少用户)的大型系统。Windows服务或IIS中的主机应用程序服务器?

我想知道。我应该将所有的逻辑托管在Windows服务或IIS中吗?

该应用程序可以在后台执行许多操作(导入,导出,为报表准备数据)。 Web客户端(ASP.NET MVC)和桌面客户端(以及其他客户端)将通过ServiceStack/WCF与我的服务连接。

回答

1

我做的:从WCF服务访问

业务逻辑(HTTP,TCP,无论你的需求)

的Windows服务,用于多线程或不重后台任务(解析巨大的XML文档,提取文件的大数据,耗时系统integraction等等等...)

UI处理光后台任务要求,并通过HTTP responsed(使用asp.net mvc的消费WCF服务或做UI的东西)

2

在同一ASP.NET应用程序中运行后台服务

如果您使用ServiceStack,则可以将您的Web service APIs and Background Services托管在同一个ASP.NET Web应用程序中。 ServiceStack为这个故事提供了很好的支持,如果你注册了IMessageService,所有OneWay Async HTTP调用都会自动推迟并发布到已注册的MQ服务(例如,对于Redis MQ,请求DTO将在服务MQ收件箱中发布)。

后台运行的服务在不同的ASP.NET应用程序

由于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的服务。

确保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服务

运行的后台服务运行其Windows服务是可能是后台服务的理想环境,因为它不受AppDomain的重启和ASP.NET请求限制。部署和调试Windows服务比较困难,它们不是跨平台的,所以我通常会避免它们,除非需要它们。但是,如果你要沿着这条路走下去,你应该检查出ServiceStack的Windows服务示范项目:

相关问题