【问题标题】:Alternative Session/static vars ASP.NET/C#替代会话/静态变量 ASP.NET/C#
【发布时间】:2012-12-19 01:58:56
【问题描述】:

我想知道.NET 环境中是否存在有效的会话或静态。 我需要的是一个变量来存储一些保持其价值的数据,可以通过所有 ASP.NET 页面/C# 表单访问但对于使用该应用程序的所有用户来说不是唯一的

【问题讨论】:

标签: c# asp.net .net session-variables static-variables


【解决方案1】:

那么您的答案很可能是应用程序缓存。看看 System.Web.Caching

由于有一些关于缓存对象生命周期的讨论,您可以设置它。用户没有具体说明,但它必须存活多长时间。在应用程序回收之间?在单个实例的生命周期内,是否需要在实例之间。缓存可以满足最简单的需求。

【讨论】:

  • 那也不能保证保值吧?
  • 在应用程序的生命周期内。默认情况下,它不会在实例之间工作。
  • 应用程序缓存保持其值,除非您将其设置为过期(滑动或绝对),或者您的应用程序重新启动,或者您通过某种其他机制删除了缓存条目。
  • +1 好的,我明白了。但这个问题也意味着不是所有用户都是唯一的,缓存是
  • 缓存对于所有用户来说肯定不是唯一的。他说他特别想要那样。
【解决方案2】:

我认为您正在寻找应用程序状态而不是应用程序缓存。 应用程序状态的工作方式与会话状态相同,但会在所有会话之间共享。

示例用法:

 Application["Message"] = "Welcome to my Website"; 

更多信息: http://www.codeproject.com/Articles/87316/A-walkthrough-to-Application-State

【讨论】:

  • 不回答问题,因为 op 特别提到了 winforms
  • 题中提到了ASP.NET,上面还有ASP.NET标签
  • 是的,那么您的答案就是正确的。但是 op 提到了 c# forms,它可能是 winforms。 Win 表单无法访问您描述的工具集
  • 但应用程序状态对所有用户共享价值。我正在寻找可以从所有页面访问的东西,但对于访问该网站的每个用户来说都是不同的。例如存储 System.Security.Principal.WindowsIdentity.GetCurrent().Name
  • 我看到在这种情况下,在 ASP.NET 中您可以使用 Session 状态,用法相同,您只需使用 Session 而不是 Application。如果您的意思是 windows 窗体,您通常会有一个人使用您的应用程序,所以这通常不是问题。除非您想提供使一台计算机上的多个用户拥有自己的配置文件的能力。然后你可以查看本地存储。
【解决方案3】:

您可以使用应用程序缓存吗?它为整个应用程序中的所有用户共享,可从所有页面访问,并且不是每个用户唯一的。

有关如何使用缓存 API 的更多详细信息,请参阅 thisthis

【讨论】:

  • 如果您需要在应用程序实例的生命周期之外维护这些值,您可能不得不求助于持久数据存储,而不是会话、缓存等,即文件或数据库。跨度>
  • 不代替会话。您可以轻松地将会话提供程序配置为使用持久存储。混合苹果和香蕉;)
【解决方案4】:

您可以尝试使用应用程序范围的变量来处理此问题。

首先在您的 Global.asax 文件中,添加以下内容:

void Application_Start(object sender, EventArgs e)
{
    [Other Stuff Already Here Omitted]
    Application["MyVariable"] = "My Default value";
}

然后在任何页面上,您都可以访问:

var myVar = Application["MyVariable"];

【讨论】:

    【解决方案5】:

    您可以将类公开为静态。这将使它在所有会话中可用,但仅限于该应用程序实例。

    【讨论】:

    • 这是您的特权,您可以随意这样做。我自己的个人标准是,否决票可能适用于不清楚或无用的答案,而不是因为个人对方法的偏好 - 归根结底,模式只是另一种工具(根据我自己的经验,经常被滥用),工作与否视情况而定。特定于 OP 的场景,静态类将满足他的需求并且具有最少数量的“移动部件” - 因此,很有用。
    【解决方案6】:

    答案是否定的。在那个级别上不存在“.Net 环境”。您的 .Net 代码也从主机获得运行时限制。 让我们定义两个主机(还有更多): IIS 和“简单的主 exe”。

    对于 IIS 托管代码,您在宿主创建线程(或者更确切地说是分配线程)并在该线程上执行代码的环境中运行。主机本身定义何时以及是否重置进程。您不能,或者更确切地说,不应该假设关于哪个进程或线程正在执行您的代码。当您谈论农场中的 iis 时,这一点会得到增强。

    对于 exe 中的简单主代码,操作系统会创建进程和初始第一个线程,并将执行指针设置为主函数中的第一条语句。

    “静态”在拥有过程的整个生命周期内保持状态,这是 .Net 给您的保证。

    “会话”是处理比静态属性更多的特定实现。

    我建议您在描述您的主机时对问题进行改进。对于 iis,答案可能是 AppFabric 缓存。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2013-01-26
      • 2018-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 2010-11-19
      • 2018-01-15
      相关资源
      最近更新 更多