2017-03-09 66 views
0

我有一個網站,我將每個用戶的TenantID存儲在一個cookie中。今天我注意到,如果我在一臺計算機上有一個用戶的網站,另一臺計算機上有另一個用戶的網站,並且同時刷新它們,則一個用戶將獲得另一個用戶的網頁內容。我將嘗試解釋網站的配置方式。一位用戶獲取其他數據的兩個用戶

在控制器中,我有一個簡單的函數來訪問數據庫並根據用戶的tenantid的cookie值來獲取用戶的頁面。

[OutputCache(Duration = 1)] //dont cache 
public ActionResult GetContent() 
{ 
    string tenantid = GetSiteCookie(); 
    if (tenantid == "") 
     return RedirectToAction("PickSite", "Login"); 

    DbContext db = new DbContext 
    var model = db.Website.FirstOrDefault(x => x.tenantID == tenantid); 

    return PartialView("ContentView", model); 
} 

當用戶點擊我有一些javascript調用我的AJAX功能,然後設置HTML在一個div在我的頁面佈局一個id = pagecontent的頁面。

$.ajax({ 
    url: '/WebSite/GetContent', 
    type: 'POST', 
    contentType: 'application/json', 
    success: function (resp) { 
     $('#pagecontent').html(resp); 
    } 
}); 

好,所以每個用戶都有自己的計算機和自己的tenantID作爲cookie存儲在瀏覽器中。頁面加載ajax函數稱爲控制器獲取cookie並返回該用戶的內容。這一次可以正常工作。但是,如果我在兩臺計算機上進行刷新,同時user1將獲取user2的數據,反之亦然。

爲了解決這個問題,我改變了我的控制器函數來接受像這樣的GetContent變量(string randomStringIDontUse =「」),然後傳入一個隨機字符串,這個字符串對於我的ajax調用中的每個用戶都是不同的。當我這樣做,並在同一時間刷新,無論我嘗試多少次,他們都會獲得自己的內容。所以這有效,但我不明白爲什麼我需要這樣做。

我甚至試圖將tenantID保存爲每個用戶的會話變量,然後調用GetContent,而不是從GetContent中的Cookie中獲取值我從會話變量中獲取tenantID,但我仍然可以以一個用戶看到別人的內容。

任何想法這裏發生了什麼,以及當查詢完全基於來自單獨計算機上不同瀏覽器的cookie時,一個用戶會獲得另一個用戶的內容?

回答

0

如果你不想緩存,你應該寫[OutputCache(Duration = 0)]還你,只要你使用$就應該設置緩存假有太多:

$.ajax({ 
     cache: false, //note this 
     url: '/WebSite/GetContent', 
     type: 'POST', 
     contentType: 'application/json', 
     success: function (resp) { 
      $('#pagecontent').html(resp); 
     } 
    }) 
+0

我也懷疑緩存,但設置Duration = 0的問題是,如果我試圖使用@ {Html.RenderAction(「GetContent」,「Website」)渲染視圖,則出現錯誤; }該錯誤會陳述「持續時間必須是正數」。 – bhs8227