我有一个网站,我将每个用户的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);
}
当用户点击页面时,我有一些调用我的ajax函数的javascript,然后在我的布局页面中将id设置为id = pagecontent的div。
$.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 :(得分:0)
如果你不想缓存,你也应该写[OutputCache(Duration = 0)]
,只要你使用$ .ajax,你也应该设置缓存false:
$.ajax({
cache: false, //note this
url: '/WebSite/GetContent',
type: 'POST',
contentType: 'application/json',
success: function (resp) {
$('#pagecontent').html(resp);
}
})
答案 1 :(得分:0)
在对缓存进行一些研究后,我发现了这篇文章
Prevent Caching in ASP.NET MVC for specific actions using an attribute
删除[OutputCache]属性并创建我自己的[NoCache]属性并将其放在我的控制器上似乎解决了这个问题。
我不是100%确定现在是否需要它,但我也会在我的ajax调用中添加cache:false。