2017-03-09 62 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