【问题标题】:Writing an incrementing counter for aspx page c#为aspx页面c#编写递增计数器
【发布时间】:2011-05-23 14:17:25
【问题描述】:

我正在开发一个确认系统,该系统会在流程完成后向用户发送一个号码。我需要的是一个递增的计数器,它会发回新的数字。这是我目前所拥有的。

int i = 100;
int Counter = i++;

w.Write(Count);

我希望计数器从 100 开始,当第一个用户使用系统时,他们打印到屏幕上的计数将是 101。第二个用户将是 102...等等。

我可以让它递增,但唯一显示的是 101,它不会保存 101 并将其递增到 102。有什么想法吗?

【问题讨论】:

    标签: c# .net asp.net counter


    【解决方案1】:

    将计数器保存到Application Vault:

    // read data
    // if no such one is present, set counter to the default value (100, etc)
    int count = Application["counter"] as int? ?? 100;
    
    // increment
    count++;
    
    // save back
    Application["counter"] = count;
    
    // do stuff you want to measure
    

    但是如果应用程序因超时而死掉,或者适当的应用程序池被回收的其他原因,这些数据将会丢失。

    因此考虑使用数据库。安装本地 SQL Express 非常简单。


    另外还有一件事要考虑:如果工作失败了,你要算进去吗?

    try
    {
        DoWork();
        Count(); // count only if success
    }
    finally
    {
        Count(); // count it anyway
    }
    

    【讨论】:

    • 我试过你的第一个例子,但它没有用......不确定,但你能解释一下“???”部分以及它在 C# 中的关系,谢谢。
    • @user630581:int? 表示int which can be null;运算符a ?? b 表示if a not null then a, otherwise bApplication["counter"] as int? ?? 100; 表示 if value returned from app vault is int? then use it, otherwise use 100。我清楚了吗?欢迎回答更多
    • Application["counter"] 也是 int 吗? ?? 100;意思是如果值为null,返回null?我已经尝试过了,但仍然无法让它工作。我遇到的问题是“计数器”写在文档中,而不是数字。
    • @user630581:如果Application["counter"]返回null(之前没有保存任何内容),则int count变为100(默认值),否则 - 存储在里面的值。不要将 counter 写入响应,仅写入 application[]。
    【解决方案2】:

    我会将它存储在 asp Application 对象或数据库中。每个请求本质上都是无状态的,因此您无法在没有会话或数据库的情况下将变量保留在范围内。

    var number = Application["NameOfObject"] as int ?? 100;
    
    number ++;
    Application["NameOfObject"] = number;
    
    w.write(number);
    

    【讨论】:

      【解决方案3】:

      Web 应用程序是无状态的,因此所有数据都会在页面重新加载时丢失。会话状态会将数据保存在内存中:

      Session("counter") = i++;
      

      但请注意,会话状态是针对每个用户的(因此每个用户都有不同的计数)。

      要让站点范围内的数据在不同的会话中长期保持,唯一真正的解决方案是将命中存储在数据库中,因为应用程序数据在重新加载应用程序时被清除(如果没有用户或有更改为 web.config)

      【讨论】:

      • 可以存储在Application对象中
      • 不是所有应用程序、会话、缓存对象都存储在内存中...?这就是为什么我们在应用启动时测试它们的存在。如何在没有数据库的情况下持久化它们?
      • 保存在外部文件中,例如XML ~/App_Data/foo.xml
      • 问题没有提到持久性,但确实提到了所有用户的数字需要递增,因此应用程序对象在这里有意义。
      • 好的,Ken,它是一个页面点击计数器。重置一个奇怪的间隔(即应用程序回收时)没有多大意义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 2011-03-03
      • 1970-01-01
      • 2017-02-21
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      相关资源
      最近更新 更多