我对asp.net-pages中的静态方法有点困惑。例如。如果我创建一个静态数据库方法来从数据库中获取Userdata(类似于UserDBHandler.getUser()),那么从网页中调用该方法是否安全?是不是为每个页面调用创建了一个新线程? 并且HttpContext.Current总是返回当前用户上下文,因此从静态方法调用它来获取当前用户会话是否安全?
感谢
答案 0 :(得分:8)
从中调用该方法是否安全 在网页
仅当此方法为reentrant时。 sql示例:
public static User GetUser(string username)
{
using (var connection = new SqlConnection(ConnectionString))
using (var command = connection.CreateCommand())
{
connection.Open();
command.CommandText = "select name, username from users where username = @username";
command.Parameters.AddWithValue("@username", username);
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
return new User
{
Username = username,
Name = reader.GetString(0),
}
}
}
return null;
}
}
在你的ASPX页面中调用:
var user = SomeClass.GetUser(Session["username"]);
总是HttpContext.Current 返回当前用户上下文,所以 从静态调用它是安全的 获取当前用户的方法 会话?
是的,HttpContext.Current可以安全地用于获取当前的HTTP上下文。但我建议你不要在数据库访问方法中调用HttpContext.Current。只需传递所需的参数作为参数,以便在调用方法时您的ASPX页面将安全地读取会话并传递所需的参数。
备注和个人建议:不使用静态方法进行数据访问。使用静态方法调用代码几乎不可能进行单元测试。
答案 1 :(得分:2)
从中调用该方法是否安全 在网页
这实际上取决于你在方法中做了什么。这种方法应该是没有副作用的功能。
不是为每个人创建一个新线程 页呼叫
是
does HttpContext.Current always return the current-users context, so is it safe to call that from static methods to get the current-users session??
是
如果你想成为一个纯粹主义者,不建议依赖静态方法,因为它们会使你的代码难以单独测试。如果A类在B类上调用静态方法,那么在没有测试/调用B的情况下,您将永远无法测试A类。
答案 2 :(得分:0)
在单个会话的范围内,我相信您将在单个线程上运行,所以这应该不是问题。
答案 3 :(得分:0)
这取决于方法的编写方式。如果方法是以线程安全的方式编写的,那么你应该没有问题。