哪种方法更受青睐?
Session.Remove("foo");
Session["foo"] = null;
Run Code Online (Sandbox Code Playgroud)
有区别吗?
正如标题所说,会话变量是否有限制(如果有的话),或者它们被视为通常的变量并且可以存储相同数量的数据?
我正在寻找除了最大长度,最大值等变量类型之外是否还有其他限制.
PS如果问题不清楚,请告诉我.
提前致谢!
SHOW VARIABLES LIKE "%wait%"
Result: 28800
SET @@GLOBAL.wait_timeout=300
SHOW GLOBAL VARIABLES LIKE "%wait%"
Result: 300
SHOW SESSION VARIABLES LIKE "%wait%"
Result:28800
Run Code Online (Sandbox Code Playgroud)
我对结果感到困惑.为什么最后一个查询给出结果:28800?
好吧,首先,在任何人试图确定这是一个"重复"的问题之前; 我已经回顾了关于类似问题的大部分关于SO的帖子,但即使结合所有已经说过的话,我仍然有点处于最终的困境,或者我应该就此达成一致意见.
然而,我可以说我(基于帖子)最终确定答案是基于要求的范围.但即使考虑到这一点,我的意见似乎也太多了,我无法决定如何处理这个问题.
我的直接要求是我需要在许多视图中保持来自1个控制器的可变数据.更具体地说,我有一个控制器和相应的视图来处理购物车项目计数,我想在多个视图中保留这些数据.我认为_layout视图是最合乎逻辑的选择.
现在我已成功完成此任务,方法是将值赋给从我的_layout视图中检索的Session变量; 因此,即使用户要浏览网站内的任何位置,购物车中的商品数量仍将持续,直到他们离开网站或完成结帐; 在这种情况下,变量将在代码中清除.
我读过的帖子似乎偏向于远离Session变量而支持Cookie并将数据存储在数据库中; 或者声明为了我建议使用它们的目的,Session变量可以很好地使用.
我读过的另一件事表明,如果网站上的流量很高,会话变量可能会阻碍整体性能,因为信息存储在服务器上.
我个人无法证明在数据库中存储此类信息并随后访问数据库是合理的,因为我认为这也会影响网站性能,并且对于临时数据的存储似乎有点过分.TempData,ViewData和ViewBag不能用于持久保存数据,因此它们不是IMO要求的逻辑选择.
如果还有另一个非常适合Session变量的替代品(这对我有用),我想知道它是什么.
在提供最佳建议方面似乎相互矛盾的2个帖子让我有些困惑.
缺点:避免在ASP.NET MVC中使用会话状态是一种好习惯吗?如果是,为什么以及如何?
优点:仍然可以在ASP.NET mvc中使用Session变量,或者对某些东西有更好的选择(比如购物车)
似乎这个问题(虽然以许多不同的变体形式呈现)没有明确的答案,我可以得出结论.
如果有一种更优选的方式来实现这一点而没有过度杀伤,那么这就是我正在寻找的答案.
我在某处读到了MVC过滤器与Global.ascx应用程序启动部分的结合使用,但这似乎不适合在控制器级别设置的变量和静态变量一样多.
有人可能会对这个主题提出许多不同的意见(可能是因为缺少一个更好的词)吗?也许可以为这个问题提供更明确的答案?我确信各种各样的意见都有它们的位置,我并不是在试图抹黑它们.但是,拥有明确且可能一致的答案会更好; 然后我可以对其他帖子进行排序,以确定最适合我的应用程序的内容.
当然,如果这个问题没有明确的答案; 告诉我,我会尝试从其他帖子中得出我自己的答案.
谢谢
================================================== =========
缓存和Cookie似乎是响应的一般偏好,但我也注意到缓存它不是在多个Web服务器上使用的理想候选者的声明,因为同步可能是一个潜在的问题.
值得称赞的是Tim,它表示数据库存储已经过优化,用户可以选择稍后返回并继续停止.
这是一个很好的观点,但对可能性保持远见; 一些用户可能无法返回,在数据库中留下不必要的数据,这可能是合理的.
因此,保持数据库优化和清洁("对我而言"具有相同的相关性)将需要实施维护任务,以根据设定的时间阈值自动使这些记录到期以考虑这些情况.虽然维护任务不是一个不容置疑的选择,但我仍然认为这仅仅为了作为临时存储的意图目的而增加了一些工作量.
尽管如此,我确实尊重蒂姆的建议,并认为在一定程度上反对我的初步意见是值得的.数据库似乎不是存储临时数据的可行选择; 所以我认为折衷方案是将数据存储在数据库中(考虑到购物车或类似的场景),可能是在结账后.正如您之前所述,这种方式可能会在后续访问时持续跟踪数据,因此您可以记录交易记录.但更重要的是,这些交易的数据与持久存在于数据库中具有真正相关性.
还有人说,尽管Session比数据库快; 但是,尽管有一些警告可以在某种程度上通过其他机制来缓解,例如利用SessionStateBehavior属性,仅作为一个例子.
但是......我认为Erik有点像Dunning-Kruger效应一样带回家.虽然,从这里给出的答案的内容和解释; 我严重怀疑任何回应的人的专业知识是否有问题.尽管如此,我倾向于同意这样一个事实:获得一致意见可能比我的合理期望高一些.
我更具体地寻找的是对一种技术的普遍共识,该技术可以舒适地适应不同的场景.换句话说,这些东西不仅可以适应我的特定场景,还可以为具有潜在更大流量的大型环境提供可扩展性元素.这样,编程的改变可以完全减轻或最小化.
==================================================
会话变量似乎适应较小的案例场景,并且在适用的情况下,但它们有一些潜在的持久性问题,以及其他值得注意的差异,正如Erik所说的非常彻底.所以这个选项显然不适合可扩展的模型.
缓存优于会话变量,但同样不是"最佳"可伸缩选项,这是由于Web服务器场环境中潜在的同步复杂性,如前所述.但仍然是一个选择.
数据库存储是可扩展的,但出于临时易失性存储的目的,从数据库的角度来看可能不是最优雅的选择,因为它需要定期清理.就个人而言,在我职业生涯早期拥有强大的数据库概念基础,这可能不会成为许多开发人员可能同意的事情.但是从程序员的角度来看,为此目的使用数据库可能足以满足Web开发的需要; 但是从DAL和DB开发的角度来看,这(对我而言)有可能强制执行额外的DB任务来强制执行有效的后端.
Cookie似乎是一个很好的选择,具有Session变量和缓存的"理想"元素.
==================================================
根据答案; 我认为COOKIES和CACHING似乎通常是全面的最佳实践建议,结合数据库存储,事后需要持续的持久性; 作为提供的可扩展性的潜在良好候选者.
2之间的最终选择似乎是基于需要存储的数据的数量和类型(例如敏感与非敏感以及是否存在客户可能改变其数据的担忧); 除了COOKIES的特殊考虑之外,它们可能会被客户禁用.
显然,从提供的答案中明确指出并得出结论,但在可扩展性方面,没有一个适合所有解决方案的解决方案; 我可能错了,但这些似乎是最好的选择.
因为所有的反应都很好; 我相当赞同所有帖子都有用,并接受Erik的答案作为一个全面的整体可扩展解决方案.我希望我可以选择多个已接受的答案,因为我相信蒂姆的回答也非常清晰和简洁.
古普塔的反应也不错,但我想更详细地提出建议的答案,而不是重复以前的帖子.
多谢你们!
asp.net-mvc session session-variables asp.net-mvc-3 asp.net-mvc-4
如果没有路由,HttpContext.Current.Session那么我知道它StateServer正在运行.当我路由我的请求时,HttpContext.Current.Session是null在路由页面中.我在IIS 7.0上使用.NET 3.5 sp1,没有MVC预览.似乎AcquireRequestState在使用路由时从不触发,因此会话变量未实例化/填充.
当我尝试访问Session变量时,我收到此错误:
base {System.Runtime.InteropServices.ExternalException} = {"Session state can only be used when enableSessionState is set to true, either in a configuration file or in the Page directive. Please also make sure that System.Web.SessionStateModule or a custom session state module is included in the <configuration>.
在调试时,我也得到了HttpContext.Current.Session在该上下文中无法访问的错误.
-
我web.config看起来像这样:
<configuration>
...
<system.web>
<pages enableSessionState="true">
<controls>
...
</controls>
</pages>
...
</system.web>
<sessionState cookieless="AutoDetect" mode="StateServer" timeout="22" /> …Run Code Online (Sandbox Code Playgroud) 真的很快速和简单的问题,但我找不到一个合适的答案 - 什么是从控制器传递数据到Magento块的最佳方法.
如果它有所不同,我正在加载布局如下:
$this->loadLayout(array('default', 'myModule_default'));
$this->_initLayoutMessages('customer/session')
->_initLayoutMessages('catalog/session')
->renderLayout();
Run Code Online (Sandbox Code Playgroud)
我应该补充一点,我一直在使用注册表如下:
在控制器中:
Mage::register('data', $data);
Run Code Online (Sandbox Code Playgroud)
在块中:
$data = Mage::registry('data');
Run Code Online (Sandbox Code Playgroud)
不知道这是否是最好的方法.
我正在尝试托管一个给我的PHP网站.我看到这个警告:
警告:未知:您的脚本可能依赖于PHP 4.2.3之前存在的会话副作用.请注意,除非启用register_globals,否则会话扩展不会将全局变量视为数据源.您可以通过将session.bug_compat_42或session.bug_compat_warn分别设置为off来禁用此功能和此警告.在第0行的未知中
这是什么意思?我如何在代码中追踪这个问题的根源?
我正在编辑一个项目,我在一个控制器方法中看到了一个Session [""],在另一个控制器方法中看到了TempData [""].4之间是否存在差异,或者只是4种方式来做同样的事情.
我需要使用jQuery设置PHP $ _SESSION变量.如果用户点击图像,我想将与该图像相关联的信息保存为php中的会话变量.
我想我可以通过调用php页面或函数并将该信息附加到查询字符串来实现.
有任何想法吗.我通过谷歌找到了一些帮助.
谢谢迈克
会话变量究竟保存在哪里?饼干?服务器内存?
再次保存应用程序变量的位置?