一个类中的静态方法 - 在这种情况下好吗?

时间:2009-01-21 18:18:23

标签: c# asp.net asp.net-2.0

嘿所有 - 我有一个应用程序,我正在验证用户。他们传递用户名和密码。我将用户名和密码传递给具有静态方法的类。例如,它调用的方法如下:

public class Security
{
public static bool Security.Member_Authenticate (string username, string password) 
{ //do stuff}
}

如果我有1000个人同时点击这个,那么这个方法的回报会不会出现问题?我的意思是,既然这些方法是静态的,那么一个人在进行身份验证时是否会出现问题,实际上他们不应该成功验证他们之前的人是否因为方法是静态的而返回不匹配的结果?我已经阅读了静态属性与viewstate的问题,但对静态方法有点困惑。如果这是一种不好的方式,那么首选方式是什么?

7 个答案:

答案 0 :(得分:7)

这不会发生。当一个方法是静态的(或在VB.NET中共享)时,只要该方法不依赖于输入以外的任何东西来解决问题,那么您就是安全的。只要你没有从其他任何地方修改任何公共变量或对象,你就可以了。

答案 1 :(得分:4)

只要在连续调用之间没有使用任何持久数据,静态方法就可以了。我猜你的方法只是在数据库上运行一个查询,并根据它返回true / false。

在这种情况下,我认为静态方法应该没有问题,无论你对它做了多少次调用。

答案 2 :(得分:3)

ASP.net确实使用了各种引擎盖下的线程池,这可以使静态方法和字段有点冒险。

但是,通过在该方法中仅使用本地范围的变量,可以避免静态方法的大多数线程问题。这样,每个线程(用户)将拥有自己所有正在使用的变量的内存副本。

如果你使用更高范围的变量,请确保所有访问它们都是线程感知的。

答案 3 :(得分:2)

抛出异常并不是一种好的做法,因为它使.net运行时创建额外的基础结构来捕获它们。要验证这一点,请创建一个类,并使用循环使用一些随机值填充它。使循环迭代为10,000个大型计数器。记录创建列表所需的时间。现在将实例创建包含在try..catch块中并记录时间。现在,您可以看到异常大的差异。

e.g

for(int i=0; i<10000; i++){
     Employee emp = new Employee();
     emp.Name = "Random Name" + i.ToString();
}

对战

for(int i=0; i<10000; i++){
     try{
          Employee emp = new Employee();
          emp.Name = "Random Name" + i.ToString();
     }catch{}
}

虽然没有固定的解决方案是否抛出异常,但最好在程序中创建备用流并使用正确的返回值处理每个条件。只有在情况可以证明是例外情况时,才应抛出例外情况。

答案 4 :(得分:1)

虽然我可以看到静态方法在感知性能提升方面的价值,但我认为这里的真正问题是增益(和风险)是否值得您可能创造的维护保障和安全漏洞。我相信大多数人会警告你不要提供接受用户凭据并返回成功或失败的公共方法。它可能提供一种简单的黑客攻击方法。

所以,我的观点是哲学的。否则,我同意那些指出限制代码使用局部变量的人应该确保你不会因为方法的并发访问而产生任何副作用问题,即使是在不同的线程上,也就是说,如果你调用方法在ThreadPool线程上。

答案 5 :(得分:0)

也许最好使用public static void Authenticate(string, string)如果出现问题会引发异常(原始方法中为return false)?

这是一个很好的.NET风格。布尔函数return-type是C样式并且已过时。

答案 6 :(得分:0)

为什么没有用户名和密码的用户类以及名为authenticate的方法?