很多用户的Padarn Session

时间:2014-04-30 17:39:48

标签: padarn

我正在为我的项目评估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";

然后我们意识到它并不适用于并发用户。

是否真的不支持并发会话?这是我缺少的一些配置吗?

2 个答案:

答案 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那样生成两个会话。然后我从两个浏览器点击页面,他们显示了不同的保存会话状态:

From Chrome From IE

答案 1 :(得分:0)

事实证明,没有任何理由,动手实验室附带了为cookie设置的域名。更糟糕的是,该域名是荒谬的。它可能是我们内部进行的某种测试的残余,并且从未恢复发布。

正在发生的事情是配置中有这个:

<Cookies Domain="169.0.0.2" />

这导致会话cookie被从任何客户端剥离(除非它的IP恰好是169.0.0.2)。

这反过来会导致每个浏览器请求生成一个新会话,这会有效地抛出会话变量。

将您的web.config更改为没有像这样的cookie域,一切都会好的:

<Cookies />

NullReferenceException代码中的Page是因为Session页面上的null对象。当达到服务的最大会话数时(每个请求生成一个新会话时会很快发生),就会发生这种情况。