2013-05-09 27 views
1

我有網頁的index.aspx和相應的服務器端代碼index.aspx.cs。如果多個客戶端連接到我的網站,此C#代碼的方法不能並行執行。我怎樣才能限制呢?如何控制ASP.NET網頁中的多個連接

以下是該方法的用途。它創建一個文件夾,將其壓縮並供用戶下載。我的要求是,當一個用戶執行此方法時,其他一些用戶不應該這樣做,因爲它會再次創建相同的文件夾,這會導致數據損壞。

我試過使用會話對象。但是我知道會話對象是以每個客戶端爲基礎存儲的。

任何人都可以建議我一些解決方案嗎?

+3

你需要重新思考你的問題。所有用戶都需要相同的壓縮文件嗎?如果不是那麼,你應該創建(隨機文件夾也許)文件夾,並保持您的調用代碼中的文件夾名稱的參考。如果您不想更改壓縮文件的創建方式,請使用緩存來存儲限制變量,而不是使用會話。 – Yahya 2013-05-09 10:28:48

+0

所有用戶不需要相同的壓縮文件。根據用戶界面上的用戶選擇,包裝不同。 – 2013-05-09 10:38:49

+0

@RaviChandra爲什麼不推遲zip的創建,直到他們嘗試下載它,然後在內存中執行?沒有爭用,並沒有浪費努力 – 2013-05-09 10:39:19

回答

1

應用程序上下文或靜態類在應用程序範圍內。所以你可以存儲一個表明進程已經啓動的標誌。程序結束後,您可以刪除標誌。

http://msdn.microsoft.com/en-us/library/94xkskdf(v=vs.100).aspx

而且總是用Application.Lock當你寫的應用程序狀態和lock(mutex)當你使用一個靜態類。

在你的情況下,靜態類會是一個更好的解決方案,因爲它似乎是應用程序上下文只爲兼容的目的,以傳統的ASP存在:Using static variables instead of Application state in ASP.NET

static object mutex= new object(); 

lock(mutex) 
{ 
    //Do the work 
} 
+1

應用程序上下文無非是靜態變量。 http://stackoverflow.com/questions/10960695/using-static-variables-instead-of-application-state-in-asp-net/10964038#10964038 – Aristos 2013-05-09 10:32:14

+0

@Aristos你是對的!我調整了我的答案! – Kai 2013-05-09 10:36:49

+0

凱,感謝您的回答,這將有助於解決我的問題 – 2013-05-09 10:47:25

1

我立即建議是:創建一個隨機文件夾每個請求的名稱,這將允許你同時運行它們。但是,如果這不是一個選項,那麼您將需要使用類似lockMutex的同步。但是,如果您從當前請求返回結果,而不是在一個請求中將其壓縮,並讓它們在下一個請求中進行下載,那麼這隻會起作用。

坦率地說,我認爲你應該在zip的請求中做zip 。事實上,除非文件很大,否則你甚至不需要觸摸文件系統 - 你可以使用MemoryStream和任何zip編碼器(例如System.IO.Packaging.ZipPackage)創建一個zip內存 - 然後只需將客戶端的數據從MemoryStream

如果您使用的是MVC,這只是return File(contents, contentType)。用香草ASP.NET你需要一個few more steps

0

如果您使用傳統的asp.net會話,則不需要執行任何操作,因爲會話全部就緒會鎖定多個用戶的頁面運行。

如果你不是,那麼你可以按照Marc的建議,使用Mutex

關於會話鎖:
Web app blocked while processing another web app on sharing same session
jQuery Ajax calls to web service seem to be synchronous
ASP.NET Server does not process pages asynchronously
Replacing ASP.Net's session entirely

+1

會話不會*同時阻止多次運行頁面(當然不是針對不同的用戶,但通常不會針對同一用戶); asp.net本身很樂意運行同一頁面的多個副本 – 2013-05-09 10:37:54

+0

@MarcGravell也許我沒有把它寫得正確?如果代碼來自頁面內部,則鎖定它們並且不會並行運行代碼。 – Aristos 2013-05-09 10:39:43