Windows服务或IIS中的主机应用程序服务器?

时间:2012-09-21 20:08:08

标签: asp.net-mvc-3 wcf architecture windows-services servicestack

我正在为我的客户开始新项目。它将是一种具有Web UI(许多用户)+桌面UI(少数用户)的大型系统。

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

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

2 个答案:

答案 0 :(得分:2)

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

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

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

由于使用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

确保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服务中运行后台服务

运行Windows服务可能是后台服务的理想环境,因为它不受AppDomain重启和ASP.NET请求限制的约束。部署和调试Windows服务更加困难,并且它们不是跨平台的,因此除非需要,否则我通常会避免使用它们。但是如果你想沿着这条路走下去,你应该查看ServiceStack的Windows服务演示项目:

答案 1 :(得分:1)

我做:

从WCF服务(http,tcp,无论您的要求是什么)访问的业务逻辑

Windows服务用于繁重的后台任务或多线程(解析大型xml文档,从文件中提取大数据,耗时的系统集成等等)

用于处理通过http请求和响应的轻量级后台任务的UI(使用asp.net mvc消耗WCF服务或执行UI Stuff)