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服務示範項目:

相關問題