Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自多个客户端的多个ASP.NET请求如何共享信息?_C#_.net_Asp.net_Multithreading_Static - Fatal编程技术网

C# 来自多个客户端的多个ASP.NET请求如何共享信息?

C# 来自多个客户端的多个ASP.NET请求如何共享信息?,c#,.net,asp.net,multithreading,static,C#,.net,Asp.net,Multithreading,Static,想象一下,在一个网站上,个人客户可以看到彼此的存在——比如社交网络或聊天室 例如: 客户端1连接到我的网站。 后端C#代码更新一个静态字段,以指示Client1的存在。 客户端2连接到我的网站。 第二个请求的后端C#代码会看到第一个请求中存储在静态字段中的信息吗?我需要做些什么来保证我的ASP应用程序的这些独立实例共享静态数据吗?如果它们正在编辑的是静态字段,那么它们将在不同的用户之间共享。您唯一应该关心的是,静态对象没有在不同线程之间共享,这是因为您有不同的web服务器托管您的应用程序(例如负

想象一下,在一个网站上,个人客户可以看到彼此的存在——比如社交网络或聊天室

例如:
客户端1连接到我的网站。
后端C#代码更新一个静态字段,以指示Client1的存在。
客户端2连接到我的网站。

第二个请求的后端C#代码会看到第一个请求中存储在静态字段中的信息吗?我需要做些什么来保证我的ASP应用程序的这些独立实例共享静态数据吗?

如果它们正在编辑的是静态字段,那么它们将在不同的用户之间共享。您唯一应该关心的是,静态对象没有在不同线程之间共享,这是因为您有不同的web服务器托管您的应用程序(例如负载平衡体系结构),因为它将是不同的应用程序域

您还可以使用状态或在所有客户端之间共享信息

在ASP.net应用程序中,应用程序/缓存是跨应用程序共享信息的常用方式之一

但是,你需要首先考虑下面的内容以确保它符合你的特定需求。 使用应用程序状态时,您必须了解各种注意事项:

  • 资源
  • 波动性
  • 可伸缩性
  • 并发性

  • 在上面的链接中引用“应用状态考虑”部分,以便在决定你的选择之前了解更多你需要考虑的事情。

    < P>这完全取决于你想分享什么信息。各种选项可以是:

    • 数据库
    • 缓存
    • 应用程序变量
    这些选项中的每一个都适合于特定的需要。您需要仔细确定您的需求,然后分析每个选项或它们的组合,以找到完美的解决方案

    如果你只是想分享状态信息,你可以看看这里的帖子

    我会考虑使用WEB应用程序可以通过WCF,

    进行通信的Windows服务。 这将使你有很大的灵活性;它允许您对进程外的数据执行附加处理(例如,聚合状态统计信息,如“扩展网络中有50人在线”)。Windows服务还使您完全摆脱进程状态机制的任何限制。它将允许您自由地进行负载平衡,并允许多个应用程序使用其数据

    如果数据是可消耗的,则使服务无状态。否则,请将部分/全部/定期数据保留到数据库中,这样即使服务和/或网站宕机,也可以恢复

    最后,如果您构建的应用程序依赖于某个服务,则它是一个潜在的单点故障。最好的安装使用数据库或同步机制来确保进程外服务的冗余

    编辑:为了提供有关原始问题的更多详细信息,静态成员可用于对ASP.Net站点运行的应用程序域的所有HTTP请求。值得一提的是,还可以(通过属性)使用不同的访问级别指定静态变量,例如
    ThreadStaticAttribute


    在实践中,静态变量是一种廉价/弱的解决方案。您必须手动同步访问,并且无法控制过期。您可以实现一个基于缓存的解决方案,无需额外的努力,也可以使用上述过程外方法来支持企业需求。

    您需要将此数据存储在两个会话都可以访问的位置,我建议您将其存储在缓存、应用程序或数据库中。看起来数据库毕竟是最佳选择。稳定性和可扩展性值得性能的提升,也值得与内存中的应用程序分离。