我建立了网站,并希望计算某些按钮的点击次数。我创建并尝试了这类计数器:
public static class Counter
{
public static int counter = 0;
}
每次点击按钮,计数器都会增加(计数器++)我会在我的网站上看到它,但是,如果我关闭chrome并再次进入我的网站,计数器将从零开始。
如何保存柜台? "静态"不需要这样做吗?
答案 0 :(得分:3)
我敢打赌它是因为应用程序空间被刷新而发生 - 它不应该因为你关闭浏览器窗口而重置,因此放弃当前会话(如果会话cookie不是持久的,那就是。)
Visual Studio可能会重新发布您的文件(如果使用远程IIS),或者只是简单地重新启动本地IIS Express实例,具体取决于您设置开发环境的方式;我确实认为将特定内容设置为Static
会使其可用于所有当前会话。
也就是说,您可能希望将其保留在当前会话中(使用Session
对象)。
或者,如果要在服务器重新启动之间保留信息,可以尝试读取和写入本地存储,例如纯文本或XML文件。您可以在以下链接中找到关于此的非常好的文章:
http://www.codeproject.com/Articles/544839/Implement-ASP-NET-custom-XML-file-configuration
更复杂的版本将使用本地(或远程)数据库,例如。
希望它适合你。
答案 1 :(得分:2)
static
字段是每个进程唯一的。根据您的应用程序池配置,您可以拥有2个,20个或100个副本。
它们也不是线程安全的。非常非常少的实例(双关语),其中静态成员是合适的。
在我的脑海中,静止的特定“实例”将在以下情况下消失:
应用程序池被回收。在IIS上,默认为20分钟不活动。
退出应用程序进程(您的应用程序池中可能有多个进程在运行)。这是(1)的一部分,但也会发生,例如,您正在使用Visual Studio调试Web服务器(Cassini),将您的项目配置为启动站点以进行调试,以及关闭最初启动的浏览器。 (这是因为VS考虑关闭它启动的浏览器,相当于说“我已经完成了播放。现在回到编码”,或者点击停止按钮。)
另一个帖子会覆盖您存储的值(谷歌“竞争条件”。)
你真的应该将它存储在数据库中。如果您正在构建网站,则无论如何都需要数据库。与应用程序状态相关的 ANYTHING 应存储在数据库中。
另外,这确实不应该发生在服务器端。每次有人点击页面上的任何位置时,您是否真的在进行回发?如果是这样,你有JavaScript来处理那个,所以只是跳过这个疯狂,让所述脚本触发AJAX请求,并让目标处理程序将其记录在数据库中
答案 2 :(得分:1)
看起来您使用网站如此推测ASP.net。存储信息的方法有很多种。数据库可以是一个或持久cookie可能是这样做的方式。请参阅此文章,了解如何创建Cookie:How do I set/unset cookie with jQuery?
答案 3 :(得分:0)
您可以尝试将其保存在会话中,然后它将保持到会话超时(20分钟),如果您希望它长时间将其写入已知位置的文件并且当您关闭Web时将值写入该文件以及当网络再次启动时从文件中获取vakue。