当用户登录时,我想将他的userID存储在
的会话中HttpContext.Current.Session["UserID"] = 2354; (this is just a hard-coded example)
然后,当我运行页面方法时,如果我这样做
var test = HttpContext.Current.Session["UserID"];
变量测试会保存我登录时存储的值吗?
如果这是一种正确的方法,当我从页面方法接收呼叫时,如何访问会话?我想在页面方法中放置test = ...行,以确定请求来自哪个用户。
感谢。
答案 0 :(得分:3)
正如已经回答的那样,是的 - 它应该没问题,但是如果你在使用这种方法[WebMethod]调用服务之前太长时间坐在页面上它就会失败。在这种情况下,最佳做法是检查会话并根据需要重建。任何其他身份验证都是如此,以确保它们不会变得不同步或过期。
[WebMethod(EnableSession = true)]
HttpContext context = HttpContext.Current;
if (context.Session["UserID"] == null) {
Utilites.PopulateSessionVars(context.Request.ClientCertificate, context.Request.ServerVariables["REMOTE_ADDR"]);
}
String userId = context.Session["UserID"].ToString();
(其中Utilities.PopulateSessionVars是一种从您用于登录的任何内容重建会话数据的方法...在我的情况下是PKI证书)
答案 1 :(得分:0)
是的,但建议您在test
变量分配后直接进行测试,以确保在尝试使用之前正确设置了UserID。
修改强>
你可以尝试:
var test;
if (HttpContext.Current.Session["UserID"] != null)
{
test = HttpContext.Current.Session["UserID"];
}
答案 2 :(得分:0)
是的,这应该有效。但是,会话和表单身份验证超时位于不同的计时器上,并且具有不同的默认超时,因此如果您使用表单身份验证,则无法保证会话中的值在用户通过身份验证的时间段内可用。
答案 3 :(得分:0)
这应该这样做
//Note: this code hasn't been tested. Correct me if I'm wrong
//To Set:
if (Session["UserId"] == null)
Session["UserId"] = "12345";
//To Get it:
if (Session["UserId"] != null)
MyObject.Id = Session["UsedId"].ToString();
答案 4 :(得分:0)
Global.asax在应用程序级别运行。您希望用户会话是一个不同的http上下文。在主页/默认登录页面中初始化会话。