想象一个网站,个别客户可以看到彼此的存在 - 比如社交网络或聊天室。
例如:
Client1连接到我的网站
后端C#代码更新静态字段以指示Client1的存在
Client2连接到我的网站
第二个请求的后端C#代码是否会看到第一个请求中存储在静态字段中的信息?有什么我需要做的,以保证我的ASP应用程序的这些单独的实例共享静态数据?
答案 0 :(得分:2)
您还可以使用Application州或Cache在所有客户之间共享信息。
在ASP.net应用程序中,应用程序/缓存将是在整个应用程序中共享信息的常用方法之一。
但是,您需要首先考虑以下事项,以确保它符合您的特定需求。
使用应用程序状态时,您必须了解各种注意事项:
请参阅上面链接中的“应用程序状态注意事项”部分,以了解有关在决定您的选择之前需要考虑的事项的更多信息。
答案 1 :(得分:2)
这完全取决于您尝试分享的信息。各种选择可以是:
这些选项中的每一个都适合特定需求。您需要仔细确定您的需求,然后分析每个选项或它们的组合以找到完美的解决方案。
如果您想分享在线状态信息,可以在此处查看此帖子 How to tackle this session problem in ASP.NET,VB.NET?
答案 2 :(得分:1)
如果是正在编辑的静态字段,则它将在不同用户之间共享。您应该担心不同线程之间不共享静态对象的唯一情况是,如果您有不同的托管应用程序的Web服务器(例如负载平衡体系结构),因为它将是不同的应用程序域。
答案 3 :(得分:1)
我会考虑使用Web应用程序可以通过WCF进行通信的Windows服务。
这将为您提供极大的灵活性;它允许您在进程外执行其他数据处理(例如,聚合在线状态统计信息,例如“扩展网络中的50人在线”)。 Windows服务还完全解除了进程状态机制中的任何限制。它允许您自由地进行负载平衡,让多个应用程序使用它的数据。
如果数据是可消耗的,请使服务无状态。否则,将部分/全部/定期数据保存到数据库,即使服务和/或网站出现故障,也可以恢复。
最后,如果您构建的应用程序依赖于服务,则 可能是单点故障。最佳安装使用数据库或同步机制来确保进程外服务的冗余。
编辑:为了提供有关原始问题的更多详细信息,静态成员可用于运行ASP.Net网站的应用程序域的所有HTTP请求。对于它的价值,还可以指定静态变量(通过属性) )具有不同的访问级别,例如ThreadStaticAttribute
。
实际上,静态变量是一种廉价/弱的解决方案。您必须手动同步访问权限,而您几乎无法控制过期时间。您可以实现基于缓存的解决方案,无需额外工作,或者转向上述流程外方法以支持企业需求。