Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.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#_Asp.net - Fatal编程技术网

C# 在ASP.NET网站中使用静态成员是否不好?

C# 在ASP.NET网站中使用静态成员是否不好?,c#,asp.net,C#,Asp.net,我知道ASP.NET网站的所有用户都将共享静态成员;但在这种特殊情况下,这正是我想要的 这是一个私人使用的网页,我把它放在一起,以方便两个用户在网上聊天。我希望避免将数据持久化到数据库或数据文件,并认为可以将最后的X消息存储在静态并发队列中。这在我的开发机器上似乎非常有效 我对ASP.NET非常缺乏经验,但在我发现的所有示例中,没有一个使用这种方法。这是一种不好的做法吗?我是否应该意识到“陷阱”?我可以看到,另一种选择是使用数据库。但我觉得这需要更多的努力,而且,我猜,这需要更多的资源(我认为我

我知道ASP.NET网站的所有用户都将共享静态成员;但在这种特殊情况下,这正是我想要的

这是一个私人使用的网页,我把它放在一起,以方便两个用户在网上聊天。我希望避免将数据持久化到数据库或数据文件,并认为可以将最后的X消息存储在静态并发队列中。这在我的开发机器上似乎非常有效


我对ASP.NET非常缺乏经验,但在我发现的所有示例中,没有一个使用这种方法。这是一种不好的做法吗?我是否应该意识到“陷阱”?我可以看到,另一种选择是使用数据库。但我觉得这需要更多的努力,而且,我猜,这需要更多的资源(我认为我的消息“缓冲区”将占用大约40kb的内存,并节省相当多的数据库访问)

假设您确保整个程序都是线程安全的,那么就可以了


但是,IIS可以随时回收您的AppDomain,因此您的队列可能会在您不期望的情况下被吹走。

假设您确保整个过程是线程安全的,那么这将起作用


但是,IIS可以随时回收您的AppDomain,因此,当您不希望队列被吹走时,您的队列可能会被吹走。

即使IIS不会时不时地刷新并重新启动您的AppDomain,使用静态变量来实现这一目的对我来说听起来像是一种难闻的攻击

HttpApplicationState
类提供对可用于存储信息的应用程序范围缓存的访问


即使IIS不会时不时地刷新并重新启动您的AppDomain,使用静态变量来实现这一目的对我来说听起来像是一种难闻的黑客行为

HttpApplicationState
类提供对可用于存储信息的应用程序范围缓存的访问


当然,我在过去看到的一个难题是在
Web Gardens
中使用静态变量

见本问题:

注意讨论中的一个关键点:

静态对象不在web gardens/web farms中共享


当然,我在过去看到的一个难题是在
webgardens
中使用静态变量

见本问题:

注意讨论中的一个关键点:

静态对象不在web gardens/web farms中共享


这是非常好的,只要您的需求没有改变,并且您可以在服务器端随机丢失所有消息

我将稍微重构代码,以提供“消息存储”接口,简化代码的测试(如果您决定将其变得更复杂/持久化/多用户,那么将来可能会有好处)

静态存储方法的Pro(或HttpApplicationState):

  • 邮件的服务器端存储没有问题-隐私问题更少。没有什么东西是永久储存的,所以你可以说任何你想说的
  • 非常简单的实现
  • 非常适合IM/电话交谈
  • 在单服务器情况下不太可能出现性能问题
缺点:

  • 消息可能会丢失。可以通过在客户机上存储历史记录(即在同一网页上使用AJAX查询检索消息)来缓解此问题
  • 当涉及到更多的用户时,如果数据是敏感的,或者由于静态数据对每个人都可见,所以应用程序与其他代码共享,则需要更加小心。与任何其他存储也没有太大区别
  • 无法直接迁移到多个服务器/web garden场景。对于两人聊天服务器来说,这是一个不太可能出现的问题

只要您的需求不发生变化,并且您可以在服务器端随机丢失所有消息,这是非常好的

我将稍微重构代码,以提供“消息存储”接口,简化代码的测试(如果您决定将其变得更复杂/持久化/多用户,那么将来可能会有好处)

静态存储方法的Pro(或HttpApplicationState):

  • 邮件的服务器端存储没有问题-隐私问题更少。没有什么东西是永久储存的,所以你可以说任何你想说的
  • 非常简单的实现
  • 非常适合IM/电话交谈
  • 在单服务器情况下不太可能出现性能问题
缺点:

  • 消息可能会丢失。可以通过在客户机上存储历史记录(即在同一网页上使用AJAX查询检索消息)来缓解此问题
  • 当涉及到更多的用户时,如果数据是敏感的,或者由于静态数据对每个人都可见,所以应用程序与其他代码共享,则需要更加小心。与任何其他存储也没有太大区别
  • 无法直接迁移到多个服务器/web garden场景。对于两人聊天服务器来说,这是一个不太可能出现的问题

另外,您只能使用一台服务器—内存中的队列实际上无法在多台计算机之间共享。+1@ChrisShain,一个人需要非常健谈,才能要求多台服务器才能与另一个人进行一对一的聊天:)此外,你只能使用一台服务器-内存队列无法在多台机器上共享。+1@ChrisShain,一个人需要非常健谈才能要求多台服务器与另一个人进行一对一的聊天:)