我正在为我的项目评估Padarn,而我正在尝试实施一个非常简单的身份验证方案:
namespace SampleSite
{
public class Login : Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (Request.Form["login"] == "admin" && Request.Form["password"] == "123")
{
Session["username"] = "admin";
Response.Redirect("PostFiles.html");
}
else
{
Response.Redirect("Default.aspx");
}
}
}
}
单个用户可以正常工作,但是,当我的朋友在我调试时试图点击页面时,抛出了NullReferenceException
Session["username"] = "admin";
然后我们意识到它并不适用于并发用户。
是否真的不支持并发会话?这是我缺少的一些配置吗?
答案 0 :(得分:0)
绝对支持多个会话。默认情况下,支持10个并发会话。
我把这个快速验证测试页面放在一起:
class SessionTest : Page
{
protected void Page_Load(object sender, EventArgs e)
{
var newVariable = Request.Form["value"];
if (newVariable != null)
{
Session["TestVariable"] = newVariable;
}
}
protected override void Render(HtmlTextWriter writer)
{
var sessionVariable = Session["TestVariable"];
writer
.Html()
.Body()
.Form(t => t
[HtmlTextWriterAttribute.Id, "Test"]
["method", "POST"])
.Text(string.Format("CurrentValue: {0}", sessionVariable ?? "[null]"))
.Br()
.Input(t => t
[HtmlTextWriterAttribute.Type, "text"]
[HtmlTextWriterAttribute.Name, "value"]
[HtmlTextWriterAttribute.Maxlength, "32"])
.EndTag() // input
.Br()
.SubmitButton("Submit", "Submit")
.EndTag() // form
.Form(t => t
[HtmlTextWriterAttribute.Id, "Reload"]
["method", "POST"])
.SubmitButton("Reload", "Reload")
.EndTag() // form
.EndTag() // body
.EndTag(); // html
}
}
它只显示当前Session的变量,并允许您更改它。我在IE中打开了两个浏览器,在Chrome中打开了一个浏览器,就像两台PC那样生成两个会话。然后我从两个浏览器点击页面,他们显示了不同的保存会话状态:
答案 1 :(得分:0)
事实证明,没有任何理由,动手实验室附带了为cookie设置的域名。更糟糕的是,该域名是荒谬的。它可能是我们内部进行的某种测试的残余,并且从未恢复发布。
正在发生的事情是配置中有这个:
<Cookies Domain="169.0.0.2" />
这导致会话cookie被从任何客户端剥离(除非它的IP恰好是169.0.0.2)。
这反过来会导致每个浏览器请求生成一个新会话,这会有效地抛出会话变量。
将您的web.config更改为没有像这样的cookie域,一切都会好的:
<Cookies />
NullReferenceException
代码中的Page
是因为Session
页面上的null
对象。当达到服务的最大会话数时(每个请求生成一个新会话时会很快发生),就会发生这种情况。