2015-05-29 21 views
0

這裏的交易:我有一個網站,多人將共享相同的帳戶,並且每個人都應該能夠在上傳文件的頁面上保留他們上傳會話的文件列表。在文件上傳頁面控制器看起來像如何讓這個對象存在於會話中?

public class FileUploadController : Controller 
{ 

    // ... 

    private List<ThreePartKey> uploadedFiles = new List<ThreePartKey>(); 

    public ActionResult Index () 

    { 
      // ... 
    } 

    [HttpPost] 
    public ActionResult Index (HttpPostedFileBase file) 
    { 
     // ... 

     if (!errorOccured) 
     { 
      uploadedFiles.Add(new ThreePartKey { orgname = selectedOrgName, catname = selectedCatName, filename = fileNameNoExtension, fullfilepath = newFileUrlPathAndName }); 
     } 

     // ... 
    } 

,問題是,uploadedFiles不斷得到重新初始化時[HttpPost] public ActionResult Index (HttpPostedFileBase file)叫,意思是上載文件的用戶列表中只顯示最後上傳一個。所以我反而嘗試

private static List<ThreePartKey> uploadedFiles = new List<ThreePartKey>(); 

而且這一切都搞砸了,因爲所有登錄用戶都共享相同的列表。

有沒有簡單的方法來做我想做的事情?

+0

如果多人共用同一個帳戶,那麼您的最佳選擇將是cookie。但是,如果您在下載時讓用戶登錄到獨一無二的帳戶,請使用數據庫存儲選項。 – Icemanind

回答

2

Controller s在每個請求中被實例化和銷燬。如果您想在Web服務器中保存信息,強烈建議使用永久性後備存儲(如數據庫)。

您可以在ASP.NET應用程序(WebForms,MVC,OWIN等)中使用static狀態,但只建議用於高速緩存以提高性能。它不能被信賴,因爲static狀態僅在當前應用程序池中的當前AppDomain本地 - 如果您的網站運行在多個池或應用程序域中,或者如果您的應用程序重新啓動(或因不活動而中止),則存儲的狀態會丟失。

+0

如果您在Web羣集中,那麼「靜態」變量也不會傳遞到羣集中的其他服務器。 –

0

On選項是爲每個請求提供一個「會話」代碼/ ID。當用戶第一次連接到您的網站時,他們會得到一個會話代碼(我使用'代碼'來表明它與我們通常所說的'會話'無關)。

每個鏈接都有該會話代碼作爲url的一部分,每個帖子都包含會話代碼。然後上傳緩存可以是:

private static ILookup<int, ThreePartKey> uploadedFiles; 

(或者,如果你喜歡字典)

private static IDictionary<int, IList<ThreePartKey>> uploadedFiles; 

取決於你的網站的其餘部分的大小,如果這是可行與否 - 在大多數情況下可能不會如上所述...但可以進行管理,例如使用IP地址作爲'代碼',或者如果您使用的是AnglurJS或單頁應用程序。

正如指出的那樣,如果應用程序池被重置,例如通過IIS中的非活動超時設置,任何靜態/單點緩存仍然會丟失。

另一種選擇是根據用戶的IP地址將文件保留在子文件夾中。

你只規定他們都使用相同的登錄名,而不是如何存儲文件等,所以也許這對你有效。

相關問題