2011-10-16 50 views
2

我有一個用ASP.NET MVC3編寫的web項目。我的Web應用程序的一部分用於保存圖像,並且運行速度很慢。因此,在嘗試保存100張圖像(其他一些工作也完成了)之後,它變得緩慢,用戶必須在瀏覽器中等待很多。ASP.NET MVC3的web和後臺進程

我正在考慮設計一個後臺服務(進程),我會發送一些數據,它會在後臺運行,不會減慢網站的使用。具體來說,我需要一個可以使用單個字符串隊列的服務。 Web應用程序可以隨時在隊列中發送新字符串,並且該服務必須對隊列中的字符串進行一些操作。

我不知道從哪裏開始或使用什麼。有什麼建議麼? :)

回答

-1

在採用自定義後臺服務方法之前,爲什麼不考慮異步請求處理。

在MVC 3中,您可以通過實施AsyncController輕鬆構建Asynchrouns控制器。有時,如果我們對於如何繼續並面對無數選擇沒有清晰的認識,那麼重用CLR中的好東西是一個更好的選擇。異步控制器利用IIS工作線程池,將所有繁重的長時間運行任務轉換爲後臺工作線程,釋放其他線程,從而緩解您遇到的性能問題。編碼明智,這並不麻煩。

因爲你可以看看這個鏈接的示例:

Using an Asynchronous Controller in ASP.NET MVC

再次我的建議是跳槽之前探索本地MVC異步方法。

+0

這並不能解決他的問題。他沒有處理服務器負載問題,他正在處理請求問題的時間長度。一個異步控制器仍然需要花費相同的時間來爲用戶獲取結果視圖,但它只是爲其他請求釋放線程。 –

2

好像你知道你想要的基本過程,從應用程序獲取請求,將數據傳遞給wcf服務,返回適當的視圖。 wcf在後臺運行。如果您想要通知發出後臺處理完成請求的用戶,但是您始終可以讓wcf服務將常規消息表寫入mvc應用程序檢查用戶的消息,這會更加棘手。

1

可能有許多不同的方式來設計這樣的東西。

的一種方法是東道國,在Windows服務管理後臺作業,具有服務接口與類似方法的WCF服務:

Guid StartJob(...) //returns new jobId<br/> 
SomeInfoObject CheckJobStatus(Guid jobId) 

這將允許Web應用程序使用Ajax ..輪詢,如果您非常喜歡,您可以向用戶顯示一個進度條(客戶端會向您的Web應用程序發出Ajax請求,然後調用該服務獲取進度信息)。

另一種方法是將任務信息寫入數據庫以安排新作業。可以使用Windows服務(甚至啓動進程的計劃任務)完成作業並在作業完成時更新數據庫。

+0

其實,我的第一個想法是使用作爲Windows服務託管的WCF服務。我只是想聽到更多的想法,也許有更好的東西可用,但wcf服務對我來說聽起來很好。我不需要該服務的任何答覆,只需開始一項工作。你認爲這應該是一個GET或POST方法嗎? –

+0

另外,例如,每24小時做一次服務調用StartJob方法的最佳方法是什麼? –

+0

@Nebo - 當數據被更改時,通常最好使用POST over GET。 GET意味着檢索某些東西,而不是創建或改變它。 – markt

1

任何形式的隊列都可以在這裏工作。看看RabbitMQ或MSMQ。基本上所有你想要的是存儲消息,你想要別的工作。

可以使用BackgroundWorker或其他東西 - 使其靜態並在Global.asax中的Application_Start上創建它。儘管如此,我認爲你最好擁有某種形式的機制,不會在網站重啓或任何事情上被拆除。

另一種選擇是把值放入一個分貝,然後你可以很容易地跟蹤它的狀態和反饋。