2011-11-23 109 views
19

我使用TempData爲了在使用RedirectToAction時保存我的模型。它工作正常,但我有一種嘮叨的感覺,這可能不是正確的做法。我真的儘量避免使用會話數據,並且我讀過TempData使用會話。使用安全嗎?在負載平衡的環境中使用它可能會出現什麼問題?TempData:安全嗎?

瑣事問題:「它是否安全?」 - 命名電影。

+3

它是祕密嗎?它安全嗎? – Dismissile

回答

21

是的,TempData由會話存儲支持,因此如果您處於負載平衡環境中,則在使用它時必須格外小心(粘性會話,持久會話狀態等)。

當使用PRG模式時,TempData一直是事實上的選擇,並且它是爲它設計的。

至於這是否是正確的做...這取決於你的用例!

PS Marathon Man。

+2

好馬拉松人 - 好電影。 –

1

我限制了使用TempData在視圖和動作之間傳遞模型對象驗證消息。我沒有從安全的角度看待Tempdata的用法,但是跟隨SO線程討論相同:HttpContext.Items with ASP.NET MVC。請參閱最後幾個主題評論和相關討論。

2

我會盡可能去完全無狀態的方法。它更具可擴展性,不受個別服務器問題的影響。通常情況下,您可以使用cookie(適當防止篡改)來識別用戶並每次從數據庫中提取數據。

除此之外,我還建議您評估您是否可以使用View而不是RedirectToAction。此:

TempData["model"] = model; 
return RedirectToAction("SomeAction"); 

可以替換:

return View("SomeAction", model); 

當然假設「SomeAction」是是來自電流控制器可訪問的有效的視圖(它或者在相同的CTRL或一個視圖上定義的在共享中),並且它不只是一個重定向到另一個的中間動作。

+4

我與返回View()的一個問題是,如果行動是一個職位,然後在瀏覽器刷新彈出煩人的消息 - 如果可能,我喜歡最終得到。也許這有點愚蠢 - 然後,臨時數據無論如何都會在刷新時丟失 - 所以也許這是一個有爭議的問題。 –

+0

嗯,但實際上你應該遵循RESP原則。如果某個操作正在讀取數據,它應該(通常)成爲GET。如果該操作正在修改數據,則應該是POST(並且從不* GET)。 –

+0

@DarioSolera你仍然可以做到這一點,並以GET結束。可以說我有一個修改數據的操作。它處於POST操作方法中。如果操作的驗證(服務器端)失敗,則可以將所有內容都推送到TempData中,然後重定向回GET頁面,以便顯示所有模型驗證錯誤等,如果刷新頁面,則只會清除該頁面而不是重新發布消息。 – Dismissile

5

那麼,我會認爲這取決於。如果您使用負載均衡器和多個前端服務器處理大量流量,那麼會話對象應避免,因爲它可能會降低性能並使難以水平擴展(在服務器場請求並不總是適用於相同的Web服務器)。

TempData是短命的,如果你沒有在那裏放置很多對象,並且對整個架構思考三次,那麼我認爲它是安全的。有很多站點廣泛使用它,並且沒有問題(我在共享和專用的託管站點上,每天使用會話數高達50-70k的訪問者,通常在同一臺服務器上使用web和數據庫)。

+0

這有助於聽到..謝謝! –

2

會話狀態可以在集羣環境中工作,提供兩種情況之一發生

  1. 您的負載均衡器支持"sticky" sessions(即在給定會話的所有請求路由到同一臺機器)
  2. 您配置會話提供使用的進程外會話提供的,您可以使用該ASP.NET State Service或的SQL Session State Provider

問題是否你應該使用tempdata或不是完全不同的問題。我會爭辯說通常有一種解決方法。如果您嘗試避免命中數據庫以重新加載某個操作已加載的對象,請考慮使用緩存。